理解go中类型转换的困惑

理解go中类型转换的困惑,go,Go,o/p: [1 2] [12] 在这里,我的理解是a、b标识符共享相同的底层类型([]字节)。因此,我们可以交换b/w 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] [12]

在这里,我的理解是a、b标识符共享相同的底层类型([]字节)。因此,我们可以交换b/w 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)
}
在第12行中,我无法分配变量。 这个错误可以通过使用显式转换T(x)来消除,我想了解为什么我们不能进行隐式转换 因为这两个变量共享相同的基础类型,但我无法分配它

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


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

这是出于设计考虑。Go编程语言需要在不同类型之间赋值,才能进行显式转换

看起来您只是简单地给字符串类型加了别名以使用不同的名称,但从技术上讲,您是在创建一个新类型,存储类型为string,这有一个细微的区别

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

类型abc=string

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

它在调试应用程序时特别有用,尤其是在数字类型之间进行转换时,以了解转换何时发生,因此,如果存在位的截断,即
uint64
uint32
,则可以明显地看到发生这种情况的位置


本例中没有任何类型转换。您希望在语言规范下使用的文档是此处的权威文档。与大多数其他语言规范不同,它非常可读。您可以分配它,但它需要显式转换:
var third abc=abc(second)
@TravisHegner我们可以使用显式转换T(x)来转换类型。你能解释一下为什么我们不能做隐式转换吗?我的原始问题是,为什么我们不能在第二个例子中做隐式转换,而我们在第一个例子中做同样的事情。
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)

}