首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >理解go中类型转换的困惑

理解go中类型转换的困惑
EN

Stack Overflow用户
提问于 2019-03-01 09:50:52
回答 1查看 68关注 0票数 2
代码语言:javascript
运行
复制
    package main

    import (
    "fmt"
    )

    type val []byte

   func main() {
    var a []byte = []byte{0x01,0x02}
    var b val = a
    fmt.Println(a)
    fmt.Println(b)
}

o/p: 1 2

这里,我的理解是a,b标识符共享相同的底层类型([]字节)。所以我们可以交换b/w两个变量的值。

代码语言:javascript
运行
复制
package main

import (
    "fmt"
)

type abc string

func main() {
    fm := fmt.Println
    var second = "whowww"
    var third abc = second //compile Error at this line 12
    fm(second)
    fm(third)

}

在第12行,我不能赋值变量。这个错误可以通过使用显式转换T(x)来消除,我想知道为什么我们不能进行隐式转换,因为两个变量共享相同的底层类型,但我无法赋值它。

有人能解释一下这些背后的原因吗?

如果可能的话,给我提供在变量、结构类型、函数参数之间进行类型转换的文档。

EN

回答 1

Stack Overflow用户

发布于 2019-03-06 00:25:57

这是设计好的。Go编程语言需要不同类型之间的赋值才能进行显式转换。

可能看起来你只是给string类型起了别名,但从技术上讲,你是在创建一个新类型,存储类型是string,这有一个细微的区别。

在Go (as of 1.9)中定义别名的方式略有不同,有一个等号。

type abc = string

如果有任何关于为什么Go没有隐式转换的困惑,当你只处理底层的字符串类型时,这可能看起来很愚蠢,但对于更复杂的类型,它确保程序员只需查看代码就能知道正在发生转换。

它在调试应用程序时特别有用,特别是当在数值类型之间转换以了解转换何时发生时,因此如果存在位截断(即uint64uint32 ),则很明显可以看到发生在哪里。

https://tour.golang.org/basics/13

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54936854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档