在我的应用程序中,我将经常传递对静电字符串的引用.我希望避免让go for each 调用分配内存,但我无法获得字符串文字的地址.

为什么不能采用字符串文字的地址(参见下面示例中的test1())?我是误解了语法,还是由于围棋的内部工作方式造成了限制?

如果不可能,最好的解决方案是什么?

test2() works, but will it allocate memory for the var hej each time?
test3() will not allocate any new memory, but I wish to avoid clutter outside the function.

package main

import "fmt"

var konnichiwa = `こんにちは世界`

// Gives the compile error `cannot take the address of "Hello world"`
func test1() (*string) { return &`Hello world` }

// Works fine
func test2() (*string) {
    hej := `Hej världen`
    return &hej
}

func test3() (*string) { return &konnichiwa }

func main(){
    fmt.Println(*test1())
    fmt.Println(*test2())
    fmt.Println(*test3())
}

谢谢你的帮助!

推荐答案

获取文本(字符串、数字等)的地址是非法的,因为它的语义不明确.

你是在取实际常量的地址吗?这将允许修改该值(并且可能导致运行时错误),或者您是否希望分配一个新对象,复制常量并将地址获取到新版本?

这种歧义在test2的情况下不存在,因为您要处理的是语义已明确定义的现有变量.如果将字符串定义为const,则不会执行相同的操作.

语言规范通过明确不允许您要求的内容来避免这种模棱两可的情况.解决方案是test2.虽然它略显冗长,但它保持了规则的简单和干净.

当然,每一条规则都有其例外,在Go中,这涉及复合文字:以下是合法的,并在规范中定义为:

func f() interface{} {
    return &struct {
        A int
        B int
    }{1, 2} 
}

Go相关问答推荐

如何在Deliverq中高效地传达客户依赖关系?

Go汇编器命名为Constants

Makefile:现有文件上没有这样的文件或目录,不加载环境变量

由于索引器压缩比限制,扫描包含golang包的图像时,伪影XRAY失败

使用ciph.AEAD.Seal()查看内存使用情况

如何在gofiber/websocket/v2中设置状态代码和原因

Go 中带有回调的 MiniDumpWriteDump

Golang:访问any类型泛型上的字段

无法读取postman 中的表单数据

Kperf 构建失败

使用goqu无法获取响应

缺少签名帮助文档

当函数返回一个函数时,为什么 Go 泛型会失败?

在 Golang 模板中计算时间/持续时间

如何在golang中按字符a对字符串数组进行排序

Golang ACMEv2 HTTP-01 挑战不挑战服务器

Go模板中的浮点除法

使用 LoadLibraryA(path_to_dll) 加载 DLL 会将文件描述符 0、1 和 2 的继承句柄标志 (HANDLE_FLAG_INHERIT) 从 1 更改为 0

gopls 为 github.com/Shopify/sarama 返回错误gopls: no packages returned: packages.Load error

Golang LinkedList 删除第一个元素