Golang基本用法(五)

go:结构体

Posted by Hzy on November 15, 2019

go中结构体的使用

1. 声明结构体的几种方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package main

import "fmt"

//定义结构体
type Point struct {
	X int
	Y int
}
func newPoint(x,y int)*Point{
	return &Point{
		X: x,
		Y: y,
	}
}
func main() {
	//通过结构体的地址实例化
	point :=&Point{
		X: 1,
		Y: 1,
	}
	//通过new关键字来实例化结构体
	point1 :=new(Point)
	point1.X = 1
	point1.Y =1
	// 用函数封装一下初始化过程
	point2 := newPoint(1,1)
	fmt.Println(point)
	fmt.Println(point1)
	fmt.Println(point2)
}

2. 嵌套的结构体

这里通过举家庭关系的例子说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package main

import "fmt"

type People struct {
	name  string
	child *[]People
	wife  *People
}

func main() {
	//一个父亲有一个妻子,一个儿子,一个女儿
	family := &People{
		name: "father",
		child: &[]People{
			{"boy", nil, nil},
			{"girl", nil, nil},
		},
		wife: &People{
			name: "wife",
			child: &[]People{
				{"boy", nil, nil},
				{"girl", nil, nil},
			},
			wife: nil,
		},
	}
	fmt.Println(family)
}

3 匿名结构体

声明匿名结构体并初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main

import "fmt"

func main() {
	cat :=&struct {
		Name string
		Color string
	}{
		"huahua",
		"red",
	}
	fmt.Println(*cat)

}

匿名结构体有可以嵌套在结构体中,这样就不用额外定义一个结构体啦。

4.结构体的方法,指针和非指针类型

非指针类型:可以达到类似只读的效果,指针类型可以修改结构体中的值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package main

import "fmt"

type Cat struct {
	Color string
	Name string
}
// 为结构体设置方法,注意这里的对象是*cat是指针类型
func (cat *Cat) setColor(color string){
	cat.Color = color
}
//为结构体设置方法,这里是非指针类型,可以达到类似只读的效果
func (cat Cat) setColor1(color string){
	cat.Color = color
}

func NewCatByName(name string) *Cat{
	return &Cat{
		Name:  name,
	}
}
func main() {
	huahua :=NewCatByName("huahua")
	huahua.setColor("red")
	fmt.Println(huahua) //&{red huahua}
	huahua.setColor1("white")
	//颜色并没有改变
	fmt.Println(huahua) //&{red huahua}
}

5.类型内嵌

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package main

import "fmt"

//类型内嵌,只定义类型,不定义字段名称
type Data struct {
	int
	float64
}

func main() {
	d := Data{
		int:     1,
		float64: 1.5,
	}
    //字段同类型名称相同,可以直接通过类型访问
	fmt.Println(d.float64)
	fmt.Println(d.int)

}

6.结构体内嵌

  • 内嵌的结构体可以直接访问里面的成员变量和方法,看看例子就知道了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package main

import "fmt"

//能走
type Walk struct {}
func (w *Walk) canWalk(){
	fmt.Println("can walk")
}
//能跑
type Run struct {}
func (r *Run)canRun(){
	fmt.Println("can run")
}
type Children struct {
	 Walk
}
type Man struct {
	 Walk
	 Run
}
func main() {
	children := new(Children)
	//这样可以直接访问结构体里的方法
	children.canWalk()
	man :=&Man{}
	man.canRun()
	man.canWalk()

}

7. 总结

  • 结构体初始化可以使用new和&{}两种方式,后者经常用且可以直接定义值,当然也可以封装成函数来实例化结构体
  • 结构体中可以嵌套自身或其他的结构体,也包括匿名结构体
  • 结构体中的方法,非指针类型可以达到类似只读效果,指针类型可以修改实例化结构体的值
  • 结构体中,当内嵌的结构体没有字段,只有结构体时,可以直接访问其内部成员或者方法。