GoLang之自定义类型、类型别名

文章目录

  • GoLang之自定义类型
    • 1.自定义类型
    • 2.类型别名
    • 3.自定义类型和类型别名的区别
    • 4.定义函数类型
    • 5.结构体
      • 5.1结构体介绍
      • 5.2new创建指针类型结构体
      • 5.3&取结构体的地址实例化
      • 5.4不初始化结构体
      • 5.5使用键值对初始化
      • 5.6对结构体指针进行键值对初始化
      • 5.7省略字段初始化
      • 5.8使用值的列表初始化
      • 5.9结构体字段的可见性
      • 5.10结构体不能与nil比较
      • 5.11先var定义结构体再单独赋值

GoLang之自定义类型

注:本文基于Windos系统上Go SDK v1.8进行

1.自定义类型

在Go语言中有一些基本的数据类型,如string、整型、浮点型、布尔等数据类型, Go语言中可以使用type关键字来定义自定义类型。
自定义类型是定义了一个全新的类型。我们可以基于内置的基本类型定义,也可以通过struct定义。例如:

type MyInt int//将MyInt定义为int类型

通过type关键字的定义,MyInt就是一种新的类型,它具有int的特性。

2.类型别名

类型别名规定:TypeAlias只是Type的别名,本质上TypeAlias与Type是同一个类型。就像一个孩子小时候有小名、乳名,上学后用学名,英语老师又会给他起英文名,但这些名字都指的是他本人。
type TypeAlias = Type
我们之前见过的rune和byte就是类型别名,他们的定义如下:

type byte = uint8
type rune = int32

3.自定义类型和类型别名的区别

结果显示a的类型是main.NewInt,表示main包下定义的NewInt类型。b的类型是int。MyInt类型只会在代码中存在,编译完成时并不会有MyInt类型。

//类型定义
type NewInt int

//类型别名
type MyInt = int

func main() {
	var a NewInt
	var b MyInt
	
	fmt.Printf("type of a:%T\n", a) //type of a:main.NewInt
	fmt.Printf("type of b:%T\n", b) //type of b:int
}

GoLang之自定义类型、类型别名_第1张图片

4.定义函数类型

GoLang之自定义类型、类型别名_第2张图片

GoLang之自定义类型、类型别名_第3张图片

GoLang之自定义类型、类型别名_第4张图片

5.结构体

5.1结构体介绍

GoLang之自定义类型、类型别名_第5张图片

GoLang之自定义类型、类型别名_第6张图片

GoLang之自定义类型、类型别名_第7张图片

image-20220127155018686

5.2new创建指针类型结构体

我们还可以通过使用new关键字对结构体进行实例化,得到的是结构体的地址。 格式如下:

type person struct {
	name string
	city string
	age  int8
}

func main() {

	var p2 = new(person)
	fmt.Println(p2)            //&{  0}
	fmt.Printf("%T\n", p2)     //*main.person
	fmt.Printf("p2=%#v\n", p2) //p2=&main.person{name:"", city:"", age:0}

}

需要注意的是在Go语言中支持对结构体指针直接使用.来访问结构体的成员。

var p2 = new(person)
p2.name = "小王子"
p2.age = 28
p2.city = "上海"
fmt.Printf("p2=%#v\n", p2) //p2=&main.person{name:"小王子", city:"上海", age:28}

5.3&取结构体的地址实例化

p3.name = "七米"其实在底层是(*p3).name = “七米”,这是Go语言帮我们实现的语法糖。

p3 := &person{}
fmt.Printf("%T\n", p3)     //*main.person
fmt.Printf("p3=%#v\n", p3) //p3=&main.person{name:"", city:"", age:0}
p3.name = "七米"
p3.age = 30
p3.city = "成都"
fmt.Printf("p3=%#v\n", p3) //p3=&main.person{name:"七米", city:"成都", age:30}

5.4不初始化结构体

没有初始化的结构体,其成员变量都是对应其类型的零值。

type person struct {
	name string
	city string
	age  int8
}

func main() {
	var p4 person
	fmt.Printf("p4=%#v\n", p4) //p4=main.person{name:"", city:"", age:0}
}

5.5使用键值对初始化

使用键值对对结构体进行初始化时,键对应结构体的字段,值对应该字段的初始值。

p5 := person{
	name: "小王子",
	city: "北京",
	age:  18,
}
fmt.Printf("p5=%#v\n", p5) //p5=main.person{name:"小王子", city:"北京", age:18}

GoLang之自定义类型、类型别名_第8张图片

5.6对结构体指针进行键值对初始化

也可以对结构体指针进行键值对初始化,例如:

p6 := &person{
	name: "小王子",
	city: "北京",
	age:  18,
}
fmt.Printf("p6=%#v\n", p6) //p6=&main.person{name:"小王子", city:"北京", age:18}

GoLang之自定义类型、类型别名_第9张图片
GoLang之自定义类型、类型别名_第10张图片

GoLang之自定义类型、类型别名_第11张图片

GoLang之自定义类型、类型别名_第12张图片

GoLang之自定义类型、类型别名_第13张图片

GoLang之自定义类型、类型别名_第14张图片

GoLang之自定义类型、类型别名_第15张图片

GoLang之自定义类型、类型别名_第16张图片

GoLang之自定义类型、类型别名_第17张图片

GoLang之自定义类型、类型别名_第18张图片

GoLang之自定义类型、类型别名_第19张图片

5.7省略字段初始化

当某些字段没有初始值的时候,该字段可以不写。此时,没有指定初始值的字段的值就是该字段类型的零值。

p7 := &person{
	city: "北京",
}
fmt.Printf("p7=%#v\n", p7) //p7=&main.person{name:"", city:"北京", age:0}

5.8使用值的列表初始化

初始化结构体的时候可以简写,也就是初始化的时候不写键,直接写值:
使用这种格式初始化时,需要注意:
1.必须初始化结构体的所有字段。
2.初始值的填充顺序必须与字段在结构体中的声明顺序一致。
3.该方式不能和键值初始化方式混用。

p8 := &person{
	"沙河娜扎",
	"北京",
	28,
}
fmt.Printf("p8=%#v\n", p8) //p8=&main.person{name:"沙河娜扎", city:"北京", age:28}

GoLang之自定义类型、类型别名_第20张图片

5.9结构体字段的可见性

image-20220127162040127

5.10结构体不能与nil比较

GoLang之自定义类型、类型别名_第21张图片

5.11先var定义结构体再单独赋值

image-20220105160336227

GoLang之自定义类型、类型别名_第22张图片

GoLang之自定义类型、类型别名_第23张图片

你可能感兴趣的:(GoLang,golang)