结构体中的方法
# 3. 结构体中的方法
# 介绍
方法是作用在指定的数据类型上、和指定的数据类型绑定,因此自定义类型,都可以有方法,而不仅仅是struct
方法的声明和调用格式:
package main
import "fmt"
type Cat struct {
name string
age int
}
// 声明方法: 给结构体Cat绑定__str方法
// 重写类似于python在__str方法
func (p Cat) __str() { //实际p就是python中类函数的self
fmt.Println(p.name, p.age) //方法中可以访问结构体的属性
}
func main() {
var p1 Cat
p1.name = "小猫咪"
p1.age = 88
// 调用方法
p1.__str()
}
/*
小猫咪 88
*/
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
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
func (p Cat) str()相当于Cat结构体有一个方法叫str
(p Cat)体现方法__str和结构体Cat绑定关系
# 注意
test方法中参数名字随意起
结构体Person和test方法绑定,调用test方法必须靠指定的类型:Person
如果其他类型变量调用test方法一定会报错。
结构体对象传入test方法中,值传递,和函数参数传递一致。
方法的访问范围控制的规则,和函数一样。方法名首字母小写,只能在本包访问,方法首字母大写,可以在本包和其它包访问。
# 自定义属性绑定方法
Golang中的方法作用在指定的数据类型上的,和指定的数据类型绑定,因此自定义类型,都可以有方法,而不仅仅是struct,比如int , float32等都可以有方法
package main
import "fmt"
type integer int
func (i integer) print() {
i = 30
fmt.Println("i = ", i)
}
func (i *integer) change() {
*i = 30
fmt.Println("i = ", *i)
}
func main() {
var i integer = 20
i.print()
i.change()
fmt.Println(i)
}
/*
i = 30
i = 30
30
*/
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
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
# 方法和函数的区别
# 绑定指定类型
方法:需要绑定指定数据类型(比如python中的self,需要添加了才知道你是属于那个类的) 函数:不需要绑定数据类型
# 调用方式不一样
- 函数的调用方式:
函数名(实参列表)
1
- 方法的调用方式:
变量.方法名(实参列表)
1
package main
import "fmt"
type Student3 struct {
Name string
}
// 定义方法:
func (s Student3) test01() {
fmt.Println(s.Name)
}
// 定义函数:
func method01(s Student3) {
fmt.Println(s.Name)
}
func main() {
//调用函数:
var s Student3 = Student3{Name: "丽丽"}
method01(s)
//方法调用:
s.test01()
}
/*
丽丽
丽丽
*/
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
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 Student struct{
Name string
}
//定义函数:
func method01(s Student){
fmt.Println(s.Name)
}
func method02(s *Student){
fmt.Println((*s).Name)
}
func main(){
var s Student = Student{"丽丽"}
method01(s)
//method01(&s)错误
method02(&s)
//method02(s)错误
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 对于方法来说,接收者为值类型,可以传入指针类型,接受者为指针类型,可以传入值类型。
package main
import "fmt"
type Student struct{
Name string
}
//定义方法:
func (s Student) test01(){
fmt.Println(s.Name)
}
func (s *Student) test02(){
fmt.Println((*s).Name)
}
func main(){
var s Student = Student{"丽丽"}
s.test01()
(&s).test01()//虽然用指针类型调用,但是传递还是按照值传递的形式
(&s).test02()
s.test02()//等价
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
编辑 (opens new window)