首页 >后端开发 >Golang >为什么我无法在 Go 中获取字符串文字的地址?

为什么我无法在 Go 中获取字符串文字的地址?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-10 01:00:11325浏览

Why Can't I Take the Address of a String Literal in Go?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn