09 自定义类型和结构体

一、类型type

type myint1 int   //自定义类型
type myint2 = int //类型别名

func main() {
	var m myint1
	m = 100
	fmt.Printf("%T\n", m) //main.myint1

	var n myint2
	n = 200
	fmt.Printf("%T\n", n) //int
}

二、结构体

1.定义

//方法1:常规定义
type person struct {
	name string
	age  int
	sex  string
}

//方法2:匿名字段定义
type animal struct {
	//每种类型只能出现一次,尽量避免使用这种方法
	string
	int
}

2.结构体初始化

type person struct {
	name string
	age  int
	sex  string
}

func main() {
	//方法1:常规初始化
	var v person
	v.name = "zhangsan"
	v.age = 20
	v.sex = "男"

	fmt.Println(v) //{zhangsan 20 男}

	//方法2:key-value初始化使用方法
	var v2 = person{
		name: "lisi",
		age:  20,
		sex:  "男",
	}

	fmt.Println(v2) //{lisi 20 男}

	//方法3:值列表初始化,值的顺序要和类型的字段定义顺序一样
	var v3 = person{
		"wangwu",
		25,
		"女",
	}

	fmt.Println(v3) //{wangwu 25 女}
}

3.匿名结构体

var v struct {
	name string
	age  int
	sex  string
}
v.name = "zhangsan"
v.age = 20
v.sex = "男"

fmt.Println(v) //{zhangsan 20 男}

4.结构体指针

type person struct {
	name string
	age  int
	sex  string
}

func main() {
	//定义方法1
	var p = new(person)

	p.name = "zhangsan"
	p.age = 20
	p.sex = "男"

	fmt.Println(p)        //&{zhangsan 20 男}
	fmt.Printf("%T\n", p) //*main.person

	//定义方法2
	var p1 = &person{
		name: "lisi",
		age:  20,
		sex:  "男",
	}

	fmt.Println(p1) //&{lisi 20 男}

	//定义方法3
	var p2 = &person{
		"wangwu",
		25,
		"女",
	}

	fmt.Println(p2) //&{wangwu 25 女}
}

5.接收者:给自定义类型定义方法

注意:接收者方法首字母大写表示方法是公共的,表示外部包可以访问

type person struct {
	name string
	age  int
	sex  string
}

//值接收者,传递结构体变量副本
func (p person) changeName1(name string) {
	p.name = name
}

//指针接收者,传递结构体变量指针
func (p *person) changeName2(name string) {
	p.name = name
}

func main() {
	var p1 = person{
		name: "lisi",
		age:  20,
		sex:  "男",
	}

	//值接收者
	p1.changeName1("zhangsan")
	fmt.Printf("我的名字叫:%s\n", p1.name) //我的名字叫:lisi

	//指针接收者
	p1.changeName2("zhangsan")
	fmt.Printf("我的名字叫:%s\n", p1.name) //我的名字叫:zhangsan
}

6.结构体嵌套

  • 常规嵌套
type animal struct {
	name string
	age  int
}

type dog struct {
	height string
	anl    animal
}

func main() {
	//方法1:
	var v dog
	v.anl.name = "beibei"
	v.anl.age = 20
	v.height = "80cm"

	fmt.Println(v) //{80cm {beibei 20}}

	//方法2:
	var v2 = dog{
		height: "90cm",
		anl: animal{
			"xiaopei",
			15,
		},
	}

	fmt.Println(v2) //{90cm {xiaopei 15}}
}
  • 匿名嵌套
type animal struct {
	name string
	age  int
}

type dog struct {
	height string
	animal
}

func main() {
	//方法1:
	var v dog
	v.name = "beibei"
	v.age = 20
	v.height = "80cm"

	fmt.Println(v) //{80cm {beibei 20}}

	//方法2:
	var v2 = dog{
		height: "90cm",
		animal: animal{
			"xiaopei",
			15,
		},
	}

	fmt.Println(v2) //{90cm {xiaopei 15}}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值