Go语言Struct结构体-方法

1. 方法的基本介绍

在某些情况下,我们需要声明(定义)方法。比如Person结构体:除了有一些字段外(年龄,姓名。。),Person结构体还有一些行为比如:可以说话、跑步。。。通过学习,还可以做算术题。这时候就要用方法才能完成。

go中的方法是作用在指定的数据类型上面的(即:和指定的数据类型绑定的),因此自定义类型,都可以有方法,而不仅仅是struct。

2. 方法的创建

基本语法

1
2
3
4
5
6
7
8
9
//(1)func (a A) test()	{}	表示 A 结构体有一方法,方法名为 test
//(2)(a A) 体现 test 方法是和 A 类型绑定的

type A struct {
Num int
}
func (a A) test() {
fmt.Println(a.Num)
}
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
package main

import "fmt"

type Person struct {
Name string
}

// 给Person类型绑定一个方法
func (person Person) test() {
person.Name = "jump"
fmt.Println("test() name=", person.Name) //输出jump
}

func main() {
var P Person
P.Name = "jack"
P.test() //调用方法
fmt.Println("main() P.Name=", P.Name)
}

/*
test() name= jump
main() P.Name= jack
*/

代码总结:

  1. test方法和Person类型绑定
  2. test方法只能通过Person类型的变量来调用,而不能直接进行调用,也不能使用其他类型变量来调用

3. 方法入门案例讲解

  1. Person结构体添加speak方法,输出xxx是一个好人
  2. Person结构体添加jisuan方法,可以计算从1+..1000的结果
  3. Person结构体添加jisuan2方法,该方法可以接收一个数n,计算从1+..+n的结果
  4. Person结构体添加getSum方法,可以计算两个数的和,并返回结果
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package main

import "fmt"

type Person struct {
Name string
}

// 给Person结构体体安家speak方法,输出是一个好人
func (p Person) speak() {
fmt.Println(p.Name, "是一个godman")
}

// 给Person结构体体安家jisuan方法,可以计算从1+..+1000的结果
// 说明方法体内可以函数一样,进行各种运算
func (p Person) jisuan() {
res := 0
for i := 1; i <= 1000; i++ {
res += i
}
fmt.Println(p.Name, "计算的结果=", res)
}

// 给Person结构体jisuan2方法,该方法可以接受一个参数n,计算从1+..+n的结果
func (p Person) jisuan2(n int) {
res := 0
for i := 1; i <= n; i++ {
res += i
}
fmt.Println(p.Name, "计算的结果=", res)
}

// 给Person结构体添加getSum方法,可以计算两个数的和,并返回结果
func (p Person) getSum(n1 int, n2 int) int {
return n1 + n2
}

// 给Person类型绑定一个方法
func (person Person) test() {
person.Name = "jack"
fmt.Println("test() name=", person.Name) //输出jack
}

func main() {
var p Person
p.Name = "tom"
p.test()
fmt.Println("main() p.Name=", p.Name) //输出tom

//调用方法
p.speak()
p.jisuan()
p.jisuan2(20)
n1 := 10
n2 := 20
res := p.getSum(n1, n2)
fmt.Println("res=", res)
}

/*
test() name= jack
main() p.Name= tom
tom 是一个godman
tom 计算的结果= 500500
tom 计算的结果= 210
res= 30
*/

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package main

import "fmt"

type Stu struct {
Name string
Age int
}

func main() {
//方式一
//在创建结构变量体时,就直接指定字段的值
var stu1 = Stu{"小明", 19}
stu2 := Stu{"小明", 20}

//在创建结构体变量时,把字段名和字段值写在一起,这种写法,就不能依赖字段的定义顺序
var stu3 = Stu{
Name: "jack",
Age: 23,
}
stu4 := Stu{
Name: "mary",
Age: 30,
}
fmt.Println(stu1, stu2, stu3, stu4)

//方式二,返回结构体的指针类型
var stu5 *Stu = &Stu{"小王", 29}
stu6 := &Stu{"小王", 36}

//在创建结构体指针变量时,把字段名和字段值写在一起,这种写法,就不能依赖字段的定义顺序
var stu7 = &Stu{
Name: "小李",
Age: 49,
}
stu8 := &Stu{
Age: 59,
Name: "小李",
}
fmt.Println(*stu5, *stu6, *stu7, *stu8)
}

/*
{小明 19} {小明 20} {jack 23} {mary 30}
{小王 29} {小王 36} {小李 49} {小李 59}
*/

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!