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

时间:2019-03-01 01:50:52

标签: go

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

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

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

1 个答案:

答案 0 :(得分:1)

这是设计使然。 Go编程语言要求在不同类型之间进行分配才能进行显式转换。

看起来您只是在别名字符串类型以使用不同的名称,但是从技术上讲,您正在创建一个新类型,其存储类型为字符串,这之间存在细微的差别。

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

type abc = string

如果对为什么Go没有隐式转换有任何困惑,当您只处理基础字符串类型,但处理更复杂的类型时,这似乎很愚蠢,它可以确保程序员仅通过查看就可以知道正在进行转换的代码。

它在调试应用程序时特别有用,特别是在数字类型之间进行转换以了解何时进行转换时,这样,如果存在从uint64uint32的位截断的情况,很明显看到发生了什么。

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