[09]Golang的结构体struct

结构struct

  • Go中的struct 与 C 中 的truct非常相似,并且Go没有class
  • 使用type< Name >struct{}定义结构,名称遵循可见性规则
  • 支持指向自身的指针类型成员
  • 支持匿名结构,可用作成员或定义成员变量
  • 匿名结构也可用于map的值
  • 可以使用字面值对结构进行初始化
  • 允许直接通过指针来读写结构成员
  • 相同类型的成员可以直接拷贝赋值
  • 支持 == 与 != 比较运算符,但不支持 > 或 <
  • 支持匿名字段,本质上是定义了某个类型为名称的字段
  • 嵌入结构作为匿名字段看起来像继承,但不是继承
  • 可以使用匿名字段指针
结构体的定义和使用
type test struct{} //定义结构体

func main() {
	a := test{}
	fmt.Println(a)
}

运行结果:
在这里插入图片描述

定义一个Person的结构

type Person struct {
	Name string
	Age  int
} //定义结构体

func main() {
	a := Person{}
	fmt.Println(a)
}

运行结果:
在这里插入图片描述

初始化

type Person struct {
	Name string
	Age  int
} //定义结构体

func main() {
	a := Person{}
	a.Name = "jack"
	a.Age = 18
	fmt.Println(a)
}

运行结果:
在这里插入图片描述

使用字面值的初始化
type Person struct {
	Name string
	Age  int
} //定义结构体

func main() {
	a := Person{ //字面值初始化
		Name: "jone",
		Age:  19,
	}
	fmt.Println(a)
	A(a) //获得的是值的拷贝
	fmt.Println(a)
}

func A(per Person) { //A(接收一个参数,Person类型)
	per.Age = 13
	fmt.Println("A", per)
}

运行结果:
在这里插入图片描述

通过指针可以拷贝地址,改变

type Person struct {
	Name string
	Age  int
} //定义结构体

func main() {
	a := Person{ //字面值初始化
		Name: "jone",
		Age:  19,
	}
	fmt.Println(a)
	A(&a) //获得的是地址
	fmt.Println(a)
}

func A(per *Person) { //A(接收一个参数,Person类型)
	per.Age = 13
	fmt.Println("A", per)
}

运行结果:
在这里插入图片描述

可以直接去结构体指针

type Person struct {
	Name string
	Age  int
} //定义结构体

func main() {
	a := &Person{ //a变成指向结构的指针
		Name: "jone",
		Age:  19,
	}
	a.Name = "ok" //可以直接对字段进行操作
	fmt.Println(a)
	A(a)
	B(a)
	fmt.Println(a)
}

func A(per *Person) { //A(接收一个参数,Person类型)
	per.Age = 13
	fmt.Println("A", per)
}

func B(per *Person) { //A(接收一个参数,Person类型)
	per.Age = 15
	fmt.Println("B", per)
}

运行结果:
在这里插入图片描述

匿名结构与字段
func main() {
	a := &struct { //临时声明了一个结构, 加&变为一个指针
		Name string
		Age  int
	}{ //进行字面值的初始化
		Name: "John",
		Age:  13,
	}
	fmt.Println(a)
}

运行结果:
在这里插入图片描述

匿名结构的嵌套

type person struct {
	Name    string
	Age     int
	Contact struct { //匿名结构
		Phone, City string
	}
}

func main() {
	a := person{Name: "John", Age: 13} //字面值的初始化
	a.Contact.Phone = "1233221"
	a.Contact.City = "wuhan"

	fmt.Println(a)
}

运行结果:
在这里插入图片描述

匿名字段

type person struct {
	string
	int
}

func main() {
	a := person{"jno", 16} //初始化时必须严格按照结构体中类型声明的顺序
	fmt.Println(a)
	var b person
	b = a
	fmt.Println(b)
}

运行结果:
在这里插入图片描述

type person struct {
	Name string
	Age  int
}

func main() {
	a := person{Name: "John", Age: 19}
	b := person{Name: "John", Age: 19}
	c := person{Name: "John", Age: 18}
	fmt.Println(a == b)
	fmt.Println(a == c)

}

运行结果:
在这里插入图片描述

嵌入结构

嵌入结构,在Go中成为组合

type human struct {
	Sex int
}

type teacher struct {
	human
	Name string
	Age  int
}

type student struct {
	human
	Name string
	Age  int
}

func main() {
	a := teacher{Name: "John", Age: 19, human: human{Sex: 0}}
	b := student{Name: "joe", Age: 20, human: human{Sex: 1}}
	fmt.Println(a, b)
	a.Name = "John2"
	a.Age = 13
	a.Sex = 200
	fmt.Println(a, b)
}

运行结果:
在这里插入图片描述

结构中的属性和内层嵌套同名的话

type A struct {
	B
	Name string
}
type B struct {
	Name string
}

func main() {
	a := A{Name: "A", B: B{Name: "B"}}
	//a.Name因为A的优先级大于B,所以输出A
	fmt.Println(a.Name, a.B.Name)
}

运行结果:
在这里插入图片描述

如果外层结构体中没有该属性的话,会从下层嵌套结果寻找

type A struct {
	B
}
type B struct {
	Name string
}

func main() {
	a := A{B: B{Name: "B"}}
	//如果外层结构体中没有该属性的话,会从下层嵌套结果寻找
	fmt.Println(a.Name, a.B.Name)
}

运行结果:
在这里插入图片描述

结构间的赋值与比较
import (
	"fmt"
)

type person struct {
	Name string
	Age  int
}

func main() {
	a := person{Name: "John", Age: 19}
	b := person{Name: "John", Age: 19}
	c := person{Name: "John", Age: 18}
	fmt.Println(a == b)
	fmt.Println(a == c)

}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值