我學k8s sdk原始碼有個問題,當方法回傳點型別時,呼叫者可以直接使用方法回傳值而不用*獲取值,
定義的方法

為什么,演示代碼,直接使用 pod,而不是 *pods
uj5u.com熱心網友回復:
這是 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 tour page 上找到了關于訪問結構欄位的這一行:
當我們擁有可以撰寫
X的結構指標時訪問結構的欄位。但是,這種表示法很麻煩,因此該語言允許我們只寫,而無需顯式取消參考。p(*p).Xp.X
所以 TL;DR 是這樣的:您可以撰寫(*pods).Items并顯式取消參考指標,但根本不需要它。在轉向 golang 之前撰寫了相當多的 C 語言,我最初認為我更喜歡箭頭運算子的顯式性質,因為我喜歡知道變數是否是指標。話又說回來,幾年后,我不能說我懷念解除參考、箭頭運算子的閑逛,更不用說多層次的間接了。99% 的時間,如果代碼寫得好,你就知道什么是指標,什么不是。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/468236.html
標籤:去 Kubernetes
上一篇:kubectl運行不創建部署
