-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path方法method
61 lines (55 loc) · 2.15 KB
/
方法method
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
方法method
Go中没有class,但是依然有Method
在 Go 语言中,结构体就像是类的一种简化形式,那么面向对象程序员可能会问:类的方法在哪里呢?在 Go 中有一个概念,它和方法有着同样的名字,
并且大体上意思相同:Go 方法是作用在接收者(receiver)上的一个函数,接收者是某种类型的变量。因此方法是一种特殊类型的函数。
接收者类型可以是(几乎)任何类型,不仅仅是结构体类型:任何类型都可以有方法,甚至可以是函数类型,可以是 int、bool、string 或
数组的别名类型。但是接收者不能是一个接口类型(参考 第 11 章),因为接口是一个抽象定义,但是方法却是具体实现;
如果这样做会引发一个编译错误:invalid receiver type…。
最后接收者不能是一个指针类型,但是它可以是任何其他允许类型的指针。
一个类型加上它的方法等价于面向对象中的一个类。一个重要的区别是:在 Go 中,类型的代码和绑定在它上面的方法的代码可以不放置在一起,
它们可以存在在不同的源文件,唯一的要求是:它们必须是同一个包的。
类型 T(或 *T)上的所有方法的集合叫做类型 T(或 *T)的方法集。
=======================
type A struct {
Name string
}
type B struct {
Name string
}
func main() {
a:=A{}
a.print()
b:=B{}
b.print()
fmt.Println(a.Name,b.Name) //查看导出值
}
func (a *A)print() { //*A指针传递到方法块中
a.Name="AA"
fmt.Println("A")
}
func (b B)print() { //没用指针b.name结束方法后值无效了
b.Name="BB"
fmt.Println("B")
}
=======方法可以访问共有字段和私有字段=========
type TZ int
func main() {
var a TZ
a.Print()
}
func (a *TZ) Print() {
fmt.Println("TZ")
}
==========
type A struct {
name string //私有字段,外部的包想访问需要Name
} //main外部包可以访问
func main() {
a:=A{}
a.Print()
fmt.Println(a.name) //可以读取私有字段
}
func (a *A) Print() {
a.name="123"
fmt.Println(a.name)
}