Golang Go语言中关于 Assignability 的描述该怎么理解?

发布于 1周前 作者 yuanlaile 来自 Go语言

Go 语言规范中关于 Assignability 的说明:

assignability

其中第二条说,如果 x 的类型 V 和类型 T 有相同的 underlying types,并且 VT 至少有一个不是 defined type,就可以将 x 赋值给类型为 T 的变量。

规范中提到了用 type 定义的新类型是 defined type, 但是没说什么不是 defined type... 我的理解是 Go 内置的类型就不是 defined type,但是下面这个例子:

type T int

var t T var x int = 1 t = x // 会报错

tx 的 underlying type 都是 int,而且 int 不是 defined type,按规范应该是可以赋值的,但实际上是会报错的。是我哪里理解错了呢?


Golang Go语言中关于 Assignability 的描述该怎么理解?

更多关于Golang Go语言中关于 Assignability 的描述该怎么理解?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

内置类型是 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语言的可赋值性主要基于类型系统的规则。简单来说,如果一个类型的值可以赋给另一个类型的变量,那么这两个类型之间就存在可赋值关系。

  1. 相同类型:最直接的情况是,两个类型完全相同。例如,int类型的值可以直接赋给int类型的变量。

  2. 接口类型:如果一个值实现了某个接口的所有方法,那么这个值就可以赋给该接口类型的变量。这是Go语言多态性的基础。

  3. 具体类型到接口类型:任何实现了某个接口的具体类型都可以赋给该接口类型。例如,如果定义了type Speaker interface { Speak() },那么任何实现了Speak方法的类型都可以赋给Speaker类型的变量。

  4. 空接口:空接口interface{}没有定义任何方法,因此任何类型的值都可以赋给空接口类型的变量。这使得空接口在Go语言中非常灵活,常用于处理不同类型的值。

  5. 匿名组合:如果一个类型内嵌了另一个类型(通过匿名字段),则内嵌类型的值也可以赋给外部类型的变量。

理解这些规则对于编写泛型代码、利用接口进行多态编程以及处理不同类型的值都非常重要。希望这些解释能帮助你更好地理解Go语言中的可赋值性。

回到顶部