关于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% 的情况下,如果代码写得好,您就知道什么是指针,什么不是指针。
我学习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 pointerp
we could write(*p).X
. However, that notation is cumbersome, so the language permits us instead to write justp.X
, without the explicit dereference.
所以 TL;DR 是这样的:您 可以 编写 (*pods).Items
并显式取消引用指针,但这根本不需要。在转向 golang 之前写过一些 C 语言,我最初认为我更喜欢箭头运算符的显式性质,因为我喜欢知道变量是否是指针。话又说回来,几年后,我不能说我怀念取消引用、箭头运算符的胡闹,更不用说多级间接寻址了。 99% 的情况下,如果代码写得好,您就知道什么是指针,什么不是指针。