返回介绍

上卷 程序设计

中卷 标准库

下卷 运行时

源码剖析

附录

2.4 自定义类型

发布于 2024-10-12 19:15:46 字数 1642 浏览 0 评论 0 收藏 0

关键字 type 基于现有类型(underlying type)定义用户自定义类型。

type A int         // 定义新类型
type B = int       // 别名
  • 即使底层类型相同,也非同一类型(区别于别名)。
  • 除运算符外,不继承任何信息(方法等)。
  • 不能隐式转换,不能直接比较。
type X int

func main() {
	var a int = 100
	
	// var b X = a
	//           ~ cannot use a (int) as type X

	b := X(a)
	println(b)

	// println(a == b)
	//         ~~~~~~ invalid operation: mismatched types int and X
}

未命名类型

boolint 这类有明确标识的类型不同, arrayslicemapchannel 等与其元素类型或长度属性相关,被称作未命名类型(unnamed type)。可用 type 提供具体名称,变为命名类型。

[]int             // unnamed type
type A []int      // named type
[2]int, [3]int   // 未命名类型: 长度不同,不是同一类型。
[]int,  []byte   // 未命名类型: 元素类型不同,不是同一类型。

具有相同声明的未命名类型被视作同一类型:

  • 相同基类型的指针(pointer)。
  • 相同元素类型和长度的数组(array)。
  • 相同元素类型的切片(slice)。
  • 相同键值类型的字典(map)。
  • 相同数据类型及操作方向的通道(channel)。
  • 相同字段序列(字段名、类型、标签、顺序)的结构体(struct)。
  • 相同签名(参数和返回值列表,不包括参数名)的函数(function)。
  • 相同方法集(方法名、方法签名,不包括顺序)的接口(interface)。
func main() {
	var a, b interface {
		test()
	}

	println(a == b)
}

转换规则:

  • 所属类型相同。
  • 基础类型相同,且其中一个是未命名类型。
  • 数据类型相同,将双向通道赋值给单向通道,且其中一个为未命名类型。
  • 将默认值 nil 赋值给切片、字典、通道、指针、函数或接口。
  • 对象实现了目标接口。
func main() {
	var a [2]int
    
    // 同一类型(相同声明的未命名类型)。
	var b [2]int = a

    // 基础类型相同,其中一个是未命名类型。
	type array [2]int
	var c array = a

	_, _, _ = a, b, c
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文