Go 中字符串文字的引用
在 Go 中获取字符串引用可以避免每次调用时分配内存,从而提高性能。但是,如下面示例中的 test1() 中所尝试的那样,直接获取对字符串文字的引用会引发问题。
var konnichiwa = `こんにちは世界` // Gives the compile error `cannot take the address of "Hello world"` func test1() (*string) { return &`Hello world` }
为什么这是不可能的?
由于语义不明确,禁止获取字符串文字的地址。这种歧义集中在引用是否应用于常量本身或常量的副本。获取常量的地址可能会因为允许修改其值而导致运行时错误。
最佳解决方案
最有效的解决方案,如 test2() 中所示,涉及使用指向现有变量的指针而不是字符串文字。这种方法比较冗长,但符合 Go 的语法并确保语义清晰。
// Works fine func test2() (*string) { hej := `Hej världen` return &hej }
异常:复合文字
语言规范对复合文字做了例外,如test3()所示。这允许创建匿名结构并随后检索其地址。
func test3() (*string) { return &struct { A int B int }{1, 2} }
虽然存在此异常,但处理静态字符串引用的推荐方法仍然是 test2(),因为它保持了简单性和清晰度.
以上是为什么我无法在 Go 中获取字符串文字的地址?的详细内容。更多信息请关注PHP中文网其他相关文章!