今天在看到 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新手需注意的知识点(二) | 精彩每一天