返回对 Go-lang 中结构的引用

我对以下代码有一些思考问题


package main


import (

    "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

关于如何做到这一点的任何想法?


ITMISS
浏览 228回答 1
1回答

慕桂英4014372

func (cmp *Company) NewWorker(name string) *worker {&nbsp; &nbsp; wrk := worker{Name: name}&nbsp; &nbsp; cmp.Workers = append(cmp.Workers, wrk)&nbsp; &nbsp; return &wrk}&总是表示“获取地址”(二进制位运算符版本除外)。 *但是,根据上下文改变含义。该表达式的*Type意思是“指向类型的指针”。express 的*Pointer意思是“Pointer 指向的对象”。这就是为什么invalid indirect of worker literal如果你尝试使用表达式会得到一个*wrk,因为你说的是“给我wrk指向的对象”,但wrk不是指针。因此,您需要*worker作为您的返回类型(返回一个指向工作人员的指针),并返回&wrk您要返回的结构的地址。另一种选择是首先使用内置new()创建指针:func (cmp *Company) NewWorker(name string) *worker {&nbsp; &nbsp; wrk := new(worker)&nbsp; &nbsp; wrk.Name = name&nbsp; &nbsp; cmp.Workers = append(cmp.Workers, *wrk)&nbsp; &nbsp; return wrk // wrk is a pointer here}话虽如此,没有什么理由在这里返回指向您的工作结构的指针。结构本身只有两个字段,这两个字段都已经是引用类型(字符串本质上只是不可变的切片),所以整个结构只有 5 个机器字长(所以 20 或 40 个字节,取决于你是在 32 位还是64 位)。您没有在返回后修改结构,并且您存储在 Company 结构中的版本也是一个副本(Company 持有一片工人,而不是一片指向工人的指针)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go