go-结构体

package main

import "fmt"

// go中的结构体
/*
 type 类名 struct {
	字段名 字段类型
	字段名 字段类型
	字段名 字段类型
	...
	}
*/

type person struct {
	name string
	city string // 同一类型的字段可以写一行
	age int8
}

// 定义结构体方法(java中类的成员方法)
// func (结构体变量名 结构体) 方法名
func (p person) Dream()  {
	fmt.Printf("%s的梦想是xxx \n", p.name)
}

// 修改成员变量(指针类型)
func (p *person) SetAge(age int8)  {
	p.age = age
}

// go方法是值拷贝的,并不会改变对象p中的age的值
func (p person) SetAge2(age int8)  {
	p.age = age
}

// 嵌套结构体 对象里面包含对象
type Student struct {
	Name string
	age int8
	Gender string
	Address Address
	Email Email
}
type Address struct {
	Province string
	City string
	UpdateTime string
}
type Email struct {
	Addr string
	UpdateTime string
}



func main()  {
	// 结构体的实例化
	var p person
	p.name = "zhangsan"
	p.city = "gz"
	p.age = 20
	fmt.Printf("p = %v \n", p)
	fmt.Printf("p = %T \n", p)
	// 键值对初始化
	p3 := person{
		name: "a",
		city: "b",
		age:  0,
	}

	// 匿名结构体, 定义在方法中中结构体
	var user struct{name string; age int}
	user.name = "lisi"
	user.age = 10
	fmt.Printf("匿名结构体 user = %v \n", user) //匿名结构体 user = {lisi 10}

	// 指针类型结构体
	var p2 = new(person)
	fmt.Printf("%T\n", p2)

	fmt.Printf("p2 = %#v\n", p2) // &main.person{name:"", city:"", age:0}
	// 去结构体的实例化地址
	p13 := &person{}
	fmt.Printf("%T\n", p13)     //*main.person
	fmt.Printf("p3=%#v\n", p13) //p3=&main.person{name:"", city:"", age:0}
	p3.name = "七米"
	p3.age = 30 // 等价 (*p3).age = 10
	p3.city = "成都"

	fmt.Printf("p3=%#v\n", p3) //p3=&main.person{name:"七米", city:"成都", age:30}
	test1()
	fmt.Println("====结构体的构造函数(指针类型)===")
	p4 := newPerson("lisi", "gz", 30)
	fmt.Printf("p4 = %T \n", p4)
	fmt.Printf("p4 = %v \n", p4)
	fmt.Println("===结构体的方法和接受者==")
	p5 := newPerson("lisi", "zg", 20)
	p5.Dream()
	p5.SetAge(15)
	fmt.Println(p5.age)
	// 函数SetAge2传递只是一个值,并不是指针
	p5.SetAge2(125)
	fmt.Println(p5.age)
	fmt.Println("===嵌套结构体==")

	stu := Student{
		Name:    "张三",
		age:     30,
		Gender:  "男",
		Address: Address{
			Province:   "广东",
			City:       "广州",
			UpdateTime: "2020-04-18",
		},
		Email: Email{
			Addr:       "nejan900@1",
			UpdateTime: "2020-04-18 12",
		},
	}

	fmt.Printf("stu = %#v\n", stu)
	fmt.Println(stu.Address.Province) // 间接访问结构体中字段
	fmt.Println(stu.Province) // 直接访问结构体中字段


}

type students struct {
	name string
	age int
}

func test1()  {
	m := make(map[string]*students)
	stus := []students{
		{name: "小w子", age: 18},
		{name: "a扎", age: 23},
		{name: "x王八", age: 9000},
	}

	for _, stu := range stus {
		m[stu.name] = &stu
	}
	for k, v := range m {
		fmt.Println(k, "=>", v.name)
	}
}

// 构造函数(当结构体字段较多,值拷贝消耗过多,使用指针类型)
// 使用指针类型,返回结构体的地址
func newPerson(name, city string, age int8) *person {
	return &person{
		name: name,
		city: city,
		age:  age,
	}
}


posted @ 2020-04-19 16:35  Ronaldo7  阅读(105)  评论(0编辑  收藏  举报