我们已经编写了一个程序,通过这个程序我们试图找到一个常数的地址.有可能这样做吗?

package main

func main() {
        const k = 5
        address := &k
}

它会给出一个错误,谁能告诉我们怎么才能找到一个常量的地址?

推荐答案

简而言之:you can't.

错误信息显示:

不能取k的地址

地址运算符&的操作数存在限制.Spec: Address operators:

对于类型T的操作数x,地址操作&x生成类型*Tx的指针.操作数必须是addressable,即变量、指针间接或片索引操作;或可寻址 struct 操作数的字段 Select 器;或可寻址数组的数组索引操作.作为可寻址要求的例外,x也可以是(可能带括号的)composite literal.如果x的求值会导致run-time panic,那么&x的求值也会导致run-time panic.

常量not被列为addressable,而规范中没有列为addressable(上面引用)的cannot则是地址运算符&的操作数(不能获取它们的地址).

不允许取常量的地址.这有两个原因:

  1. 常量可能根本没有地址.
  2. 即使在运行时内存中存储了一个常量值,这也有助于运行时保持以下常量:constant.如果你可以取一个常量值的地址,你可以把地址(指针)分配给一个变量,你可以改变它(指针值,常量值).Robert Griesemer(Go的作者之一)写道,为什么不允许使用字符串文本的地址:"If you could take the address of a string constant, you could call a function [that assigns to the pointed value resulting in] possibly strange effects - you certainly wouldn't want the literal string constant to change."(source)

如果你需要一个指针指向一个等于该常数的值,把它赋给一个可寻址的变量,这样你就可以得到它的地址,例如.

func main() {
    const k = 5
    v := k
    address := &v // This is allowed
}

但是要知道,在围棋中,数值常量表示任意精度的值,并且不会溢出.当您将常量的值赋给变量时,这可能是不可能的(例如,常量可能大于您为其赋值的变量类型的最大值,从而导致编译时错误),或者它可能不相同(例如,在浮点常量的情况下,它可能会失go 精度).

Go相关问答推荐

T的Golang通用切片,其中 *T实现接口

使用Gorm创建自定义连接表

Go Fiber和HTMX—HX—Trigger header被更改为HX—Trigger,这不是HTMX监听的内容

向API网关终结点发出POST请求时出现AWS Lambda With Go:";Rune me.InvalidEntrypoint";错误

如果第一次匹配条件,如何跳过切片中的值

Docker 执行失败并显示cmd/ENTRYPOINT 中的命令未找到

使用 httptest 对 http 请求进行单元测试重试

我突然无法再将我的 GoLang 应用程序部署到 Google AppEngine

泛型:实现嵌套接口

使用 Grafana alert 在几分钟内重复alert

如何确定作为函数参数传递的指针是否正在被修改或副本是否正在被修改?

Golang 通过接口反映/迭代{}

为什么 `append(x[:0:0], x...)` 将切片复制到 Go 中的新后备数组中?

如何在 Docker 容器中使用私有存储库进行身份验证

如果 transaction.Commit 对带有 postgres 连接的 SQL 失败,您是否需要调用 transaction.RollBack

具有未导出字段的 struct 类型之间的转换

有没有办法将 yaml node 添加到 golang 中现有的 yaml 文档中?

如何在 Windows 上使用 cgo 为 386 arch 构建 lib?

具有相同提前返回语句的函数的不同基准测试结果

使用 delve 在容器中调试 Golang:container_linux.go:380:启动容器进程导致:exec:/dlv:stat /dlv:没有这样的文件或目录