2
    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] [1 2]

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

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) 消除此错误,我想了解为什么我们不能进行隐式转换因为两个变量共享相同的基础类型,但我无法分配它。

有人可以解释这些背后的原因吗?

如果可能的话,可以为我提供关于变量、结构类型、函数参数之间类型转换的良好文档。

4

1 回答 1

1

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

看起来您只是简单地将字符串类型别名为具有不同的名称,但从技术上讲,您正在创建一个新类型,存储类型为字符串,但存在细微差别。

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

type abc = string

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

它在调试应用程序时特别有用,特别是在数字类型之间进行转换以了解何时发生转换时,因此如果有位截断,即uint64to uint32,很明显可以看到发生的位置。

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

于 2019-03-05T16:25:56.550 回答