Go语言入门7-结构struct

Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。

结构体是由一系列具有相同类型或不同类型的数据构成的数据集合
结构体表示一项记录,比如保存图书馆的书籍记录,每本书有以下属性:
itle :标题
Author : 作者
Subject:
学科 ID:书籍ID

  1. 使用 type < Name > struct{ } 定义结构,名称遵循可见性规则
type person struct {
	Name string
	Age  int
}

func main() {
	//可以使用字面值对结构进行初始化
	a := person{
		Name: "yang",
		Age:  20,
	}
	//如果要访问结构体成员,需要使用点号 . 操作符,
	a.Age = 19
	fmt.Println(a)	//{yang 19}
}
  1. 结构是值类型,所以对结构进行传递的时候是值拷贝,不会影响本来的值
func main() {
	a := person{
		Name: "yang",
		Age:  20,
	}
	fmt.Println(a)	//{yang 20}
	A(a)
	fmt.Println(a)	//{yang 20}
}
func A(per person) {
	per.Age = 18
	fmt.Println("A", per)	//A {yang 18}
}
  1. 允许直接通过指针来读写结构成员,如果通过指针进行传递的话,本来的值就会被改变了
func main() {
	a := &person{ 		//此时a是指向结构的指针
		Name: "yang",
		Age:  20,
	}
	a.Name = "yuanmie" //此时可以直接更改属性,不需要用(*a.Name = "yuanmie")这样用*取出指针指向的底层值
	fmt.Println(a)     //&{yuanmie 20}
	A(a)
	fmt.Println(a) 	   //&{yuanmie 18}
}
func A(per *person) {
	per.Age = 18
	fmt.Println("A", per) //A &{yuanmie 18}
}
  1. 支持匿名结构,可用作成员或定义成员变量
func main() {
	a := struct {	//取地址的话直接&struct就可以
		Name string
		Age  int
	}{
		Name: "xu",
		Age:  18,
	}
	fmt.Println(a) //{xu 18}
}
  1. 匿名结构也可以嵌套在其他结构中
type person struct {
	Name    string
	Age     int
	Contact struct {	//注意Contact不是结构名,而是person结构的第三个属性名
		phone, city string
	}
}

func main() {
	a := person{Name: "xy", Age: 18}
	a.Contact.phone = "12345678910"
	a.Contact.city = "beijing"
	fmt.Println(a) //{xy 18 {12345678910 beijing}}
}
  1. 相同类型的成员可进行直接拷贝赋值,支持 == 与 !=比较运算符,但不支持 > 或 <
type person struct {
	Name string
	Age  int
}

func main() {
	a := person{Name: "xy", Age: 18}
	var b person
	b = a
	fmt.Println(b)      //{xy 18}
	fmt.Println(b == a) //true
}
  1. 支持匿名字段,本质上是定义了以某个类型名为名称的字段
type person struct {
	string
	int
}

func main() {
	a := person{"xy", 18}	//赋值的类型必须严格按照结构里的类型顺序
	fmt.Println(a)	//{xy 18}
}
  1. 嵌入结构作为匿名字段看起来像继承,但不是继承
type human struct {
	Sex int
}

type person struct {
	human
	Name string
	Age  int
}

type student struct {
	human
	Name string
	Age  int
}

func main() {
	a := person{Name: "xy", Age: 18, human: human{Sex: 0}}
	b := student{Name: "ym", Age: 20, human: human{Sex: 1}}
	fmt.Println(a, b) //{{0} xy 18} {{1} ym 20}
	a.Name = "xy2"
	a.Age = 13
	a.Sex = 1
	fmt.Println(a, b) //{{1} xy2 13} {{1} ym 20}
}
  1. 嵌入结构和外层结构有同名字段时候:
type A struct {
	B
	Name string
}

type B struct {
	Name string
}

func main() {
	a := A{Name: "xy", B: B{Name: "ym"}}
	fmt.Println(a)        //{{ym} xy}
	fmt.Println(a.Name)   //xy
	fmt.Println(a.B.Name) //ym
}

猜你喜欢

转载自blog.csdn.net/weixin_36302575/article/details/86065067
今日推荐