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两个变量的值。
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)来消除,我想知道为什么我们不能进行隐式转换,因为两个变量共享相同的底层类型,但我无法赋值它。
有人能解释一下这些背后的原因吗?
如果可能的话,给我提供在变量、结构类型、函数参数之间进行类型转换的文档。
发布于 2019-03-05 16:25:57
这是设计好的。Go编程语言需要不同类型之间的赋值才能进行显式转换。
可能看起来你只是给string类型起了别名,但从技术上讲,你是在创建一个新类型,存储类型是string,这有一个细微的区别。
在Go (as of 1.9)中定义别名的方式略有不同,有一个等号。
type abc = string
如果有任何关于为什么Go没有隐式转换的困惑,当你只处理底层的字符串类型时,这可能看起来很愚蠢,但对于更复杂的类型,它确保程序员只需查看代码就能知道正在发生转换。
它在调试应用程序时特别有用,特别是当在数值类型之间转换以了解转换何时发生时,因此如果存在位截断(即uint64
到uint32
),则很明显可以看到发生在哪里。
https://stackoverflow.com/questions/54936854
复制相似问题