为了账号安全,请及时绑定邮箱和手机立即绑定

返回对 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 关注
  • 227 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号