【问题标题】:Why i cant apply address operator (&) to functions return values directly [duplicate]为什么我不能将地址运算符(&)直接应用于函数返回值[重复]
【发布时间】:2017-04-07 15:35:53
【问题描述】:

我不明白为什么下面的代码 sn-p 没有编译。编译器声明:

cannot take the address of getAString()

代码:

func getAStringPointer() *string {
    return &getAString()
}

func getAString() string {
    return ""
}

但是,将函数的结果存储在辅助变量中并返回该变量的地址,编译器的行为就可以了。

func getAStringPointer() *string {
    var aString = getAString()
    return &aString
}

func getAString() string {
    return ""
}

【问题讨论】:

  • 试试&(getAString())
  • 对此发表评论。操作顺序意味着& 在函数调用() 之前应用。你得到的错误是你试图获取函数的地址。
  • @KerrekSB 这也不起作用(你可以尝试过)。在 Go 中,您根本无法获取调用返回值的地址。
  • @icza in the stackoverflow.com/questions/30744965/… 答案很长,并没有像 RayfanWindspear 那样谈论运算符优先级。
  • @RayfenWindspear 如果你说的是真的,那就是原因,这首先是我的问题......我不想归档任何东西,我只是质疑为什么我不能做那个任务。请 izca 重新阅读我的问题以及您标记为重复的问题。

标签: function pointers go


【解决方案1】:

您不能将& 应用于这样的值(除非它是复合文字)。来自规范:

对于 T 类型的操作数 x,地址操作 &x 生成一个 *T 类型的指针指向 x。操作数必须是可寻址,即 变量、指针间接或切片索引操作; 或可寻址结构操作数的字段选择器;或数组 可寻址数组的索引操作。作为一个例外 可寻址性要求,x 也可以是(可能是括号) 复合字面量。如果 x 的评估会导致运行时 恐慌,那么 &x 的评估也是如此。

【讨论】:

  • 好的@andy 谢谢!...除了基于规范的答案不能满足我对为什么我不能在表达式上应用 & 的逻辑推理所需的事实(毕竟这是一个函数电话是)..我想知道到底发生了什么..
  • 将地址运算符应用于表达式意味着创建一个匿名变量来存储值,然后获取该值的地址。 (您只能获取表示存储在内存中的值的地址)。我想不出任何不能支持它的特殊原因,但显然 Go 的作者决定不支持它。也许其他人有更好的解释。您可能想尝试在groups.google.com/forum/#!forum/golang-nuts 上提问。
  • 谢谢安迪!非常有用的评论,这与答案一起可以作为正确答案接受!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-10
  • 1970-01-01
  • 1970-01-01
  • 2014-03-23
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
相关资源
最近更新 更多