亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

返回對 Go-lang 中結構的引用

返回對 Go-lang 中結構的引用

Go
ITMISS 2022-03-03 16:02:42
我對以下代碼有一些思考問題package mainimport (    "fmt")type Company struct {    Name string    Workers []worker}type worker struct {    Name string    Other []int}func (cmp *Company) NewWorker(name string) worker {    wrk := worker{Name: name}    cmp.Workers = append(cmp.Workers, wrk)    return wrk}func main() {    cmp := Company{}    cmp.Name = "Acme"    wrk := cmp.NewWorker("Bugs")    for i := 1; i <= 10; i++ {        wrk.Other = append(wrk.Other, i)    }    fmt.Println(wrk)    fmt.Println(cmp)}https://play.golang.org/p/Bja7u148mg如您所見,代碼不是返回我正在創建的工作人員,而是返回它的副本。我怎樣才能讓它返回實際的工人?我在不同的工作人員上嘗試了 * 和 & 的一些變體,但我最終得到:invalid indirect of worker literal (type worker)要么:cannot use wrk (type worker) as type *worker in return argument關于如何做到這一點的任何想法?
查看完整描述

1 回答

?
慕桂英4014372

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 持有一片工人,而不是一片指向工人的指針)。


查看完整回答
反對 回復 2022-03-03
  • 1 回答
  • 0 關注
  • 225 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號