匿名字段的方法
package main
import "fmt"
// 属于结构体的匿名字段的方法可以直接调用
type Address struct {
city string
state string
}
func (a Address) fullAddress(){
fmt.Println(a.city,a.state)
}
type Person struct {
name string
age int
Address
}
func main() {
p := Person{
name:"Jack",
age:41,
Address:Address{
city:"NJ",
state:"CHN",
},
}
p.fullAddress() // 访问 Address 结构体的 fullAddress() 方法
}
方法值接收器与函数值参数使用区别
package main
import "fmt"
// 当一个函数有一个值参数,它能接收一个值参数;
// 当一个方法有一个值接收器,它可以接受值接收器和指针接收器
type Rectangle struct {
length int
width int
}
func area(r Rectangle){
fmt.Println("func:",r.width * r.length)
}
func (r Rectangle) area(){
fmt.Println("指针:",r.width * r.length)
}
func main() {
r := Rectangle{
length:20,
width:30,
}
area(r)
r.area()
p := &r
//area(p) //报错,compilation error
p.area() //相当于 (*p).area()
}
函数与方法使用指针接收器
package main
import "fmt"
// 函数使用指针参数只接收指针,
// 而使用指针接收器的方法可以使用值接收器和指针接收器
type rect struct {
length int
width int
}
func Area(r *rect){
fmt.Println(r.length * r.width)
}
func (r *rect) Area(){
fmt.Println(r.length * r.width)
}
func main() {
r := rect{
length:15,
width:10,
}
p := &r
Area(p)
p.Area()
//Area(r) //报错 cannot use r (type rect) as type *rect in argument to Area
r.Area() // 使用值来调用指针接收器
}
在非结构体上的方法
package main
// 为了在一个类型上定义一个方法,方法的接收器类型定义和方法的定义应该在同一个包中 。
// 在下面的代码中尝试把一个 add 方法添加到内置的类型 int,这是不允许的,
// 因为 add 方法的定义和 int 类型的定义不在同一个包中。
func (a int) add(b int){
}
func main() {
// 运行该程序报错 cannot define new methods on non-local type int
}
package main
// 让该程序工作的方法是为内置类型 int 创建一个类型别名,然后创建一个以该类型别名为接收器的方法。
type myInt int
func (a myInt) add(b myInt){
}
func main() {
}
Ref