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)消除此错误,我想了解为什么我们无法进行隐式转换 由于两个变量共享相同的基础类型,但我无法对其进行分配。
有人可以解释这些背后的原因吗?
如果可能的话,可以为我提供有关变量,结构类型,函数参数之间的类型转换的良好文档。
答案 0 :(得分:1)
这是设计使然。 Go编程语言要求在不同类型之间进行分配才能进行显式转换。
看起来您只是在别名字符串类型以使用不同的名称,但是从技术上讲,您正在创建一个新类型,其存储类型为字符串,这之间存在细微的差别。
在Go(as of 1.9)中定义别名的方式略有不同,存在一个等号。
type abc = string
如果对为什么Go没有隐式转换有任何困惑,当您只处理基础字符串类型,但处理更复杂的类型时,这似乎很愚蠢,它可以确保程序员仅通过查看就可以知道正在进行转换的代码。
它在调试应用程序时特别有用,特别是在数字类型之间进行转换以了解何时进行转换时,这样,如果存在从uint64
到uint32
的位截断的情况,很明显看到发生了什么。