结构体中的方法
  # 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)