Golang Go语言中关于 Assignability 的描述该怎么理解?
Go 语言规范中关于 Assignability 的说明:
其中第二条说,如果 x
的类型 V
和类型 T
有相同的 underlying types,并且 V
和 T
至少有一个不是 defined type,就可以将 x
赋值给类型为 T
的变量。
规范中提到了用 type
定义的新类型是 defined type, 但是没说什么不是 defined type... 我的理解是 Go 内置的类型就不是 defined type,但是下面这个例子:
type T int
var t T
var x int = 1
t = x // 会报错
t
和 x
的 underlying type 都是 int
,而且 int
不是 defined type,按规范应该是可以赋值的,但实际上是会报错的。是我哪里理解错了呢?
Golang Go语言中关于 Assignability 的描述该怎么理解?
更多关于Golang Go语言中关于 Assignability 的描述该怎么理解?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
内置类型是 defined type,因为在 builtin 包里有这样的定义
type int int
type string string
符合 defined type 的定义
所以不能赋值
复合类型就不是 defined type,例如下面的变量的类型都不是 defined type
var p *int
var c chan int
var a [2]int
var m map[int]int
var f func(int) int
更多关于Golang Go语言中关于 Assignability 的描述该怎么理解?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Go语言中,Assignability(可赋值性)是一个核心概念,它定义了值能否被赋给某个变量。理解这一点对于编写健壮和高效的Go代码至关重要。
Go语言的可赋值性主要基于类型系统的规则。简单来说,如果一个类型的值可以赋给另一个类型的变量,那么这两个类型之间就存在可赋值关系。
-
相同类型:最直接的情况是,两个类型完全相同。例如,
int
类型的值可以直接赋给int
类型的变量。 -
接口类型:如果一个值实现了某个接口的所有方法,那么这个值就可以赋给该接口类型的变量。这是Go语言多态性的基础。
-
具体类型到接口类型:任何实现了某个接口的具体类型都可以赋给该接口类型。例如,如果定义了
type Speaker interface { Speak() }
,那么任何实现了Speak
方法的类型都可以赋给Speaker
类型的变量。 -
空接口:空接口
interface{}
没有定义任何方法,因此任何类型的值都可以赋给空接口类型的变量。这使得空接口在Go语言中非常灵活,常用于处理不同类型的值。 -
匿名组合:如果一个类型内嵌了另一个类型(通过匿名字段),则内嵌类型的值也可以赋给外部类型的变量。
理解这些规则对于编写泛型代码、利用接口进行多态编程以及处理不同类型的值都非常重要。希望这些解释能帮助你更好地理解Go语言中的可赋值性。