1 回答

TA貢獻1871條經驗 獲得超13個贊
func (cmp *Company) NewWorker(name string) *worker {
wrk := worker{Name: name}
cmp.Workers = append(cmp.Workers, wrk)
return &wrk
}
&總是表示“獲取地址”(二進制位運算符版本除外)。 *但是,根據上下文改變含義。該表達式的*Type意思是“指向類型的指針”。express 的*Pointer意思是“Pointer 指向的對象”。這就是為什么invalid indirect of worker literal如果你嘗試使用表達式會得到一個*wrk,因為你說的是“給我wrk指向的對象”,但wrk不是指針。
因此,您需要*worker作為您的返回類型(返回一個指向工作人員的指針),并返回&wrk您要返回的結構的地址。
另一種選擇是首先使用內置new()創建指針:
func (cmp *Company) NewWorker(name string) *worker {
wrk := new(worker)
wrk.Name = name
cmp.Workers = append(cmp.Workers, *wrk)
return wrk // wrk is a pointer here
}
話雖如此,沒有什么理由在這里返回指向您的工作結構的指針。結構本身只有兩個字段,這兩個字段都已經是引用類型(字符串本質上只是不可變的切片),所以整個結構只有 5 個機器字長(所以 20 或 40 個字節,取決于你是在 32 位還是64 位)。您沒有在返回后修改結構,并且您存儲在 Company 結構中的版本也是一個副本(Company 持有一片工人,而不是一片指向工人的指針)。
- 1 回答
- 0 關注
- 225 瀏覽
添加回答
舉報