方法类似于函数,但有一点不同,关键字func放后面添加了另一个参数部分,用于接受单个参数。
import "fmt"
import "strconv"
type Gril struct {
Name string
Age int
}
func (g *Gril) info() string {
return g.Name+","+strconv.Itoa(g.Age)
}
func main() {
g := Gril{
Name:"lili",
Age:11,
}
fmt.Println(g.info())
}
方法接收者是一种类型,这里是指向结构体的指针,后面是方法名,参数,返回类型。如果使用函数,则在每个使用函数或结构体的地方,都需要包含函数和结构体的定义,导致代码重复。
方法集是可对特定数据类型进行调用的一组方法。任何数据类型都可有相关联的方法集,这使数据类型和方法之间建立关系。方法集可包含的方法数量不受限制,这是一种封装功能和创建库代码的有效方式。
import "fmt"
import "strconv"
type Gril struct {
Name string
Age int
}
func (g *Gril) info() string {
return g.Name+","+strconv.Itoa(g.Age)
}
func (g *Gril) getAge() int {
return g.Age
}
func main() {
g := Gril{
Name:"lili",
Age:11,
}
fmt.Println(g.info())
fmt.Println(g.getAge())
}
还是使用上面的结构体,一个方法是获取名称和年龄的组合,一个是获取年龄的方法。
方法是一个接受被称为接收者的特殊参数的函数,接收者可以是指针,也可以是值,但两者的差别非常微妙,下面的设置Age参数的方法使用的参数是值,修改的结构体的副本。
import "fmt"
import "strconv"
type Gril struct {
Name string
Age int
}
func (g *Gril) info() string {
return g.Name+","+strconv.Itoa(g.Age)
}
func (g Gril) setAge() int {
g.Age = 12
return g.Age
}
func main() {
g := Gril{
Name:"lili",
Age:11,
}
fmt.Println(g.setAge())
fmt.Println(g.info())
}
输出
12
lili,11