关于k8s sdk方法return指针类型

about k8s sdk method return pointer type

我学习k8s sdk源码有个问题,当一个方法return点类型时,调用者可以 直接使用方法return取值而不用*取值,the demo code

定义的方法

为什么,演示代码,直接用pods,不是*pods

这是 go 与 C 家族中其他(主要是较旧的)语言之间的差异之一。在某些语言中,您需要使用专用运算符来访问通过间接访问(即指针)的对象上的字段,在 golang 中,点运算符处理两者。

万一有人偶然发现这个问题并且不知道这一切意味着什么:如果你在 C:

中有一个指向这样的类型的指针
typedef struct pod_list {
    item items[100]; // or something
} pod_list;

您需要编写以下内容才能访问 items 数组:

item * an_item = pods->items[1];

或者您需要先取消引用指针,然后直接访问数组:

item *an_item = (*pods).items[1]; // can't remember off the top of my head if the brackets are needed here though

Golang 有一个箭头运算符,但它用于写入通道:

ch := make(chan struct{}, 1)
ch <- struct{}{}

或者在将其作为参数传递时指定通道方向性:

func doStuff(ctx context.Context, ch chan<- struct{}) {
    // this function can only write to the channel
}
func doMoreStuff(ctx context.Context, ch <-chan struct{}) {
    // this function can only read from the channel
}

在访问对象字段时,. 运算符处理直接和间接访问。我快速浏览了 golang 页面,看看他们是否详细说明了这个设计决策,并在 golang 旅游页面上找到了关于访问结构字段的这一行:

To access the field X of a struct when we have the struct pointer p we could write (*p).X. However, that notation is cumbersome, so the language permits us instead to write just p.X, without the explicit dereference.

所以 TL;DR 是这样的:您 可以 编写 (*pods).Items 并显式取消引用指针,但这根本不需要。在转向 golang 之前写过一些 C 语言,我最初认为我更喜欢箭头运算符的显式性质,因为我喜欢知道变量是否是指针。话又说回来,几年后,我不能说我怀念取消引用、箭头运算符的胡闹,更不用说多级间接寻址了。 99% 的情况下,如果代码写得好,您就知道什么是指针,什么不是指针。