Skip to content

Latest commit

 

History

History
112 lines (82 loc) · 1.99 KB

chapter19.md

File metadata and controls

112 lines (82 loc) · 1.99 KB

自定义类型

使用关键字type就可以开始自定义类型,包括基于现有基础类型创建,或者是结构体、函数类型等

type name int8

多个type还可以合成一个组

package main

import (
	"fmt"
)

type (
	user struct {
		name string
		age  uint8
	}
	event func(string) bool
)

func main() {
	u := user{"Jason", 20}
	fmt.Println(u)
	var f event = func(s string) bool {
		fmt.Println(s)
		return s != ""
	}
	f("abc")

}

结果

{Jason 20}
abc

注意

package main

import (
	"fmt"
)

type data int

func main() {
	var d data = 10
	var x int = d
	fmt.Println(x)
	fmt.Println(d == x)

}

d虽然底层的数据类型是int,但其与int是两个不同的概念,不能作为相同的数据类型看待

未命名类型

与有明确标识符的bool、int、string等类型相比,数组、切片、字典、通道等类型与具体元素类型或长度等属性有关,故称作未命名类型。当然,可用type为其提供具体的名称,将其改变为命名类型

  • 具有相同基类型的指针
  • 具有相同元素类型和长度的数组
  • 具有相同元素类型的切片
  • 具有相同键值类型的字典
  • 具有相同数据类型及操作方向的通道
  • 具有相同字段序列(字段名、字段类型、标签、以及字段顺序)的结构体
  • 具有相同签名(参数的返回值列表,不包括参数名)的函数
  • 具有相同方法集(方法名、方法签名、不包括顺序)的接口

未命名类型转换规则

  • 所属类型相同
  • 基础类型相同,且其中一个是未命名类型
  • 数据类型相同,将双向通道给单向通道,且其中一个为未命名类型
  • 将默认值nil赋值给切片、字典、通道、指针、函数或接口
  • 对象实现了目标接口
package main

import (
	"fmt"
)

type data [2]int

func main() {
	var d data = [2]int{1, 2}
	fmt.Println(d)
	a := make(chan int, 2)
	var b chan<- int = a
	b <- 2

}

结果

[1 2]