golang 方法( method )
1. 方法的定义
方法总是绑定对象实例,并隐式的将实例作为第一实参(receiver),receiver可以是基础类型,也可以是指针类型,这会关系到是否需要有可以修改对象实例的能力。
2. 方法的声明和调用
方法的创建语法:
func (recevier type) methodName(参数列表)(返回值列表){}
方法的调用
package main
import "fmt"
type People struct { //定义一个People的结构体,包含姓名,年龄,爱好
SurName string
Age int
hobby string
}
func (p People) Play() { //创建一个方法,输出这个人的爱好
fmt.Printf("%v,年龄为%v,爱好为%v", p.SurName, p.Age, p.hobby)
}
func (p People) login(name string, pwd int) bool { //创建一个登陆方法,绑定方法People,传入name和pwd,返回一个bool类型的登陆状态
fmt.Printf("姓名为:%v,登陆账号为:%v,密码为:%v\n", p.SurName, name, pwd) //输出传入信息
if name == "li" && pwd == 123456 { //判断传入进来的账号密码信息
return true //正确返回true
} else {
return false //错误返回false
}
}
func main() {
li := People{ //创建一个People的实例
"李",
25,
"玩游戏",
}
li.Play() //调用play方法
fmt.Println()
loginState := li.login("li", 123456) //调用login方法,并将登陆状态赋值到loginState
fmt.Printf("登陆状态为:%v", loginState) //打印登陆状态
}
执行结果
李,年龄为25,爱好为玩游戏
姓名为:李,登陆账号为:li,密码为:123456
登陆状态为:true
3. 指针接收器与非指针接收器
由于指针的特性,修改指针接收器的任意成员,在方法调用结束之后,会对原有的数据产生效果
而非指针接收器是值拷贝一份,方法内修改接收器的成员,在方法结束之后不影响原有值
package main
import "fmt"
type test1 struct {
Name string
Age int
}
func (t test1) method1() { //传入结构体的值类型
t.Name = "李四"
fmt.Printf("method1中修改后的Name:%v\n", t.Name)
}
func (t *test1) method2() { //传入结构体的指针类型
(*t).Name = "王五" //自动解引用,等价于t.Name = "王五"
fmt.Printf("method2中修改后的Name:%v\n", (*t).Name) //(*t).Name可以省略为t.Name
}
func main() {
t1 := test1{
Name: "张三",
Age: 30,
}
t2 := &test1{
Name: "张三",
Age: 30,
}
t1.method1()
fmt.Printf("执行完method1后,t1实例的值:%v\n", t1)
t2.method2()
fmt.Printf("执行完method2后,t1实例的值:%v\n", *t2)
}
执行结果
method1中修改后的Name:李四
执行完method1后,t1实例的值:{张三 30}
method2中修改后的Name:王五
执行完method2后,t1实例的值:{王五 30}
4. 方法的注意事项
4.1 方法的receiver type并非一定要是struct类型,type定义的类型别名、slice、 map、channel、func类型等都可以。
package main
import "fmt"
type Newint int
func (i Newint) test1() {
fmt.Println(i)
}
func main() {
var t1 Newint = 10
t1.test1()
}
执行结果
10
4.2 如果一个类型实现了String方法,那么fmt.Println默认会调用String进行输出。
package main
import "fmt"
type test1 struct {
Name string
}
func (t test1) String() string { //定义一个方法名为String
var str string
str = t.Name
//str = fmt.Printf("name=%v,age=%v", t.Name, t.Age)
return str
}
func main() {
t1 := test1{ //构件一个实例
Name: "张三",
}
fmt.Println(t1)
}
执行结果
张三