gpt4 book ai didi

function - 我的函数返回一个结构;为什么编译器不允许分配给该结果值的字段?

转载 作者:行者123 更新时间:2023-12-01 21:20:27 24 4
gpt4 key购买 nike

在golang中,如果我在函数中返回一个struct类型,会出现编译错误,我必须使用struct的指针作为返回类型,才能通过函数调用直接实现成员访问。这是为什么? foo() 不返回 Employee 类型的临时变量吗?

package main


type Employee struct {
ID int
Name string
Address string
Position string
Salary int
ManagerID int
}
var dilbert Employee


func foo() Employee {
employee := Employee{}
return employee
}

func bar() *Employee {
employee := Employee{}
return &employee
}

func main() {
dilbert.Salary = 1
var b = foo()
b.Salary = 1

bar().Salary = 1 // this is good
foo().Salary = 1 // this line has the compilation error cannot assign to foo().Salary
}

最佳答案

在 Go 中,variable是可寻址的,即您可以获得地址的值。如果左侧是可寻址的,则分配有效。

bar().Salary = 1 是合法的,因为

  1. bar().Salary 实际上是 (*bar()).Salary;
  2. 的语法糖
  3. *bar() 是可寻址的,因为它是指针间接;
  4. 可寻址结构的字段(例如 Salary)本身是可寻址的

相比之下,foo().Salary = 1 是非法的,因为 foo() 返回一个值,但它不是一个变量也不是指针间接;无法获取 foo() 的地址。这就解释了为什么该语句被编译器拒绝。请注意,引入中间变量可以解决您的问题:

// type and function declarations omitted

func main() {
f := foo()
f.Salary = 1 // compiles fine
}

关于function - 我的函数返回一个结构;为什么编译器不允许分配给该结果值的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59763707/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com