今天在看到 struct 章节,其中提及到了方法,先看下Go中的方法定义语法:
一般形式:
func (recv receiver_type) methodName(parameter_list) (return_value_list) { ... }
如果方法不需要使用 recv 的值,可以用 _ 替换它,比如:
func (_ receiver_type) methodName(parameter_list) (return_value_list) { ... }
一、方法的接受者类型(receiver_type)
方法的接受者类型几乎可以是任何类型。Go中的类型参考:Go新手需注意的知识点(一) 下面举例说明:
1、int型系列、浮点型系列、字符串、bool、byte、rune、uintptr
type Node int64 //其它的类型类推,此处并非是一个struct func main { var nxt Node nxt = 32 fmt.Println(nxt.Add()) } func (_ Node) Add() int { return 4 }
2、数组
type Node [5]int
func main {
var nxt Node
nxt[1] = 99
fmt.Println(nxt.Add())
}
func (b Node) Add() int {
return b[1]
}
3、切片
type Node []int
func main {
var nxt Node
nxt = []int{1,2,3,4,5}
fmt.Println(nxt.Add())
}
func (b Node) Add() int {
return b[1]
}
4、map
type Node map[string]string
func main {
var nxt Node
nxt = map[string]string{"a":"aa", "b":"bb"}
fmt.Println(nxt.Add())
}
func (b Node) Add() string {
return b["a"]
}
5、struct
这里不介绍,大家都周知。
6、函数类型
type Node func() int
func main {
var nxt Node
nxt = func() int {
return 99
}
fmt.Println(nxt.Add())
}
func (b Node) Add() int {
return b()
}
7、不支持接口类型、指针类型
二、注意
1、一个类型加上它的方法等价于面向对象中的一个类。一个重要的区别是:在 Go 中,类型的代码和绑定在它上面的方法的代码可以不放置在一起,它们可以存在在不同的源文件,唯一的要求是:它们必须是同一个包的。
2、因为类型的方法只能在同一包里定义,但可以通过一种间接的方式来实现。比方说要给time包增加一个Add的方法,但因为time是内置的包。
type myTime struct {
time.Time
}
func main (){
nxt := myTime{time.Now()}
fmt.Println(nxt.Add(1))
}
func (b myTime) Add(a int) int {
return a + 1
}
3、recv 传值和传地址的区别
例子1:
type B struct {
thing int
}
.......
var b1 B
fmt.Println(&b1.thing)
b1.change()
.........
func (b B) change() {
b.thing = 2
fmt.Println(&b.thing)
}
输出结果:
0xc42006e030
0xc42006e038
例子1:
type B struct {
thing int
}
.......
var b1 B
fmt.Println(&b1.thing)
b1.change()
.........
func (b *B) change() {
b.thing = 2
fmt.Println(&b.thing)
}
输出结果:
0xc42000a290
0xc42000a290
从上面的2个例子中,也可以看出指针方法和值方法都可以在指针或非指针上被调用

Pingback引用通告: Go新手需注意的知识点(二) | 精彩每一天