方法的声明(定义)
furie (recevier type) methodName (参数列表) (返回值列表){
方法体
return返回值
}
1)参数列表:表示方法输入
2) recevier type:表示这个方法和type这个类型进行绑定,或者说该方法作用于type类型
3) receiver type:type可以是结构体,也可以其它的自定义类型 type integer int
4) receiver:就是type类型的一个变量(实例),比如:Person结构体的一个变量(实例)
5)返回值列表:表示返回的值,可以多个
6)方法主体:表示为了实现某一功能代码块
7)return语句不是必须的。
方法注意事项和细节讨论
1)结构体类型是值类型,在方法调用中,遵守值类型的传递机制,是值拷贝传递方式
2)如果希望在方法中,修改结构体变量的值,可以通过结构体指针的方式来处理
为了提高效率,通常方法和结构体的指针类型绑定
type person struct {
name string
}
func (p *person) Test() {
fmt.Printf("%p\n", p)
}
func main() {
var p person
fmt.Printf("%p\n", &p)
p.Test()
}
3)Golang中的方法作用在指定的数据类型上的(即:和指定的数据类型绑定),因此自定义类型,都可以有方法,而不仅仅是struct,比如int,float32等都可以有方法
package main
import "fmt"
type integer int
func (i *integer) Test() {
fmt.Println("i的地址为:", i, "i的值为:", *i)
*i = 100
}
func main() {
a := 9
b := integer(a)
fmt.Println("b的地址为:", &b, "b的值为:", b)
b.Test()
fmt.Println("修改过后的值为:",b)
}
b的地址为: 0xc0000180a8 b的值为: 9
i的地址为: 0xc0000180a8 i的值为: 9
修改过后的值为: 100
4)方法的访问范围控制的规则,和函数一样。方法名首字母小写,只能在本包访问,方法首字母大写,可以在本包和其它包访问。
5)如果一个变量实现了String()这个方法,那么fmt.Println默认会调用这个变量的String()进行输出
如果实现了*person类型的String()方法,那么就会自动调用。
type person struct {
name string
age int
}
func (p *person) String() string {
str := fmt.Sprintf("name=%v age=%v", p.name, p.age)
return str
}
func main() {
p := &person{
name: "lucas",
age: 29,
}
fmt.Println(p)
}
name=lucas age=29
如果这里不是指针类型,而是值类型那么就不会调用
package main
import "fmt"
type person struct {
name string
age int
}
func (p *person) String() string {
str := fmt.Sprintf("name=%v age=%v", p.name, p.age)
return str
}
func main() {
p := person{
name: "lucas",
age: 29,
}
fmt.Println(p)
}
{lucas 29}