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 关注
- 227 浏览
添加回答
举报