当前位置: 首页 > 面试题库 >

为什么我无法在Go中获得类型转换的地址?

傅安宁
2023-03-14
问题内容

当我编译这段代码时,编译器告诉我我 不能使用str(s)的地址

func main() {
    s := "hello, world"
    type str string
    sp := &str(s)
}

所以我的问题是 类型转换 是否会寻找新地址来定位当前的new s,还是我没有想到的其他东西?


问题答案:

Go编程语言规范

表达方式

表达式通过将运算符和函数应用于操作数来指定值的计算。

转换次数

转换是形式为T(x)的表达式,其中T是类型,x是可以转换为类型T的表达式。

地址运算符

对于类型T的操作数x,地址操作&x生成指向 T的类型
T的指针。操作数必须是可寻址的,即变量,指针间接寻址或切片索引操作;或可寻址结构操作数的字段选择器;或可寻址数组的数组索引操作。除可寻址性要求外,x还可为(可能带有括号的)复合文字。如果对x的求值会引起运行时恐慌,那么对&x的求值也是如此。

表达式是临时的临时值。表达式值没有地址。它可以存储在寄存器中。转换是一种表达。例如,

package main

import (
    "fmt"
)

func main() {
    type str string
    s := "hello, world"
    fmt.Println(&s, s)

    // error: cannot take the address of str(s)
    sp := &str(s)
    fmt.Println(sp, *sp)
}

输出:

main.go:13:8: cannot take the address of str(s)

要寻址,值必须像变量一样是持久的。例如,

package main

import (
    "fmt"
)

func main() {
    type str string
    s := "hello, world"
    fmt.Println(&s, s)

    ss := str(s)
    sp := &ss
    fmt.Println(sp, *sp)
}

输出:

0x1040c128 hello, world
0x1040c140 hello, world


 类似资料:
  • 问题内容: 我想知道为什么你不能做: 我发现这将需要运行时在片上执行循环以转换每个元素,这将是非惯用的Go。这很有道理。 然而,这可能不会被刚刚走样编译器解决的,所以在内部它们是相同的,他们使用相同类型的头底下?我猜答案虽然不是我好奇为什么。 问题答案: 这个: 是类型转换。根据规范,转换具有特定的规则: 在以下任何一种情况下,可以将非恒定值转换为类型: 是分配给。 的类型,并且具有相同的基础类型

  • 我收到的错误: 这是我的代码 我尝试了几种不同的方法来读取此文件,但我无法弄清楚为什么会发生这种情况。我使用的扩展名.rtf,.txt,认为这可能是文件本身的问题。该文件仅包含以下内容:

  • 问题内容: 我有一个大小字节数组,做完之后。 错误: 我找到解决这个问题的方法 改成: 但是为什么不能这样使用它呢? 问题答案: 简短的答案是因为Go语言规范不允许这样做。 引用Go语言规范:转换: 在以下任何一种情况下,可以将非恒定值转换为类型: 可分配给。 的类型,并且具有相同的基础类型。 的类型和是未命名的指针类型,它们的指针基类型具有相同的基础类型。 x的类型均为整数或浮点类型。 x的类型

  • 问题内容: 在日食中显示错误。这是总和是122字节范围内的范围。所以为什么我在这里出现此错误。 提前致谢… 问题答案: 当您对字节执行数学运算时,Java会对字节进行扩展(自动类型提升)到字节(隐式转换)以对这种情况进行整数处理。所以当你表演 由于t1 + t2的结果比字节宽,因此您需要将其下转换为字节。 消除编译错误。 有关更多信息,请阅读 JLS 5.1.2

  • 问题内容: 该测试失败并 问题答案: datastore.Put函数的文档说: Put使用键k将实体src保存到数据存储中。src必须是结构指针或实现PropertyLoadSaver;如果是结构指针,则该结构的任何未导出字段都将被跳过。如果k是不完整的密钥,则返回的密钥将是由数据存储区生成的唯一密钥。 尝试将其与PropertyList一起使用时,这有些令人困惑。PropertyList不实现P

  • 最后是宠物类,它应该是reponse: