Go中结构体 struct 中的方法

今天在看到 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个例子中,也可以看出指针方法和值方法都可以在指针或非指针上被调用

Go中结构体 struct 中的方法》上有1条评论

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

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>