recv
方法的定义
定义一个Persion的结构体,并且绑定一个sayname方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main
import "fmt"
type Person struct {
name string
age int
}
func (self Person) sayname() {
fmt.Printf("My name is %s and age is %d \n", self.name, self.age)
}
func main() {
p := Person{
"yangyanxing", 18,
}
p.sayname()
}
My name is yangyanxing and age is 18 saynamefunc (self Person) sayname()(self Person)selfthis
这里定义方法并没有使用指针方式,所以方法体里是操作的变量的拷贝,如果结构休比较大,或者说即使不大的话,对于性能要求比较高的系统也会有一些影响,所以一般情况下,会使用结构体指针形式定义方法.
1
2
3
func (self *Person) sayname() {
fmt.Printf("My name is %s and age is %d \n", self.name, self.age)
}
但是在调用的时候,既可以使用结构体变量本身,也可以使用指针
1
2
3
4
5
6
7
8
func main() {
p := Person{
"yangyanxing", 18,
}
pt := &Person{"yyx", 20}
p.sayname()
pt.sayname()
}
sayname
上面的sayname方法没有修改变量本身的值,如果需要修改变量值的话,那么就需要使用指针了.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main
import "fmt"
type Person struct {
name string
age int
}
func (self Person) changeage(age int) {
// 改变age
self.age = age
}
func main() {
p := Person{
"yangyanxing", 18,
}
fmt.Println(p)
p.changeage(100)
fmt.Println(p)
}
上面的方法并不会将p的age修改为100
1
2
{yangyanxing 18}
{yangyanxing 18}
这时需要将接收者改为指针形式
1
2
3
4
func (self *Person) changeage(age int) {
// 改变age
self.age = age
}
String() 方法
toString ()__str__String()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main
import "fmt"
type Person struct {
name string
age int
}
func (self Person) String() string {
return fmt.Sprintf("Person name is %s and age is %d", self.name, self.age)
}
func main() {
p := Person{
"yangyanxing", 18,
}
fmt.Println(p)
}
Person name is yangyanxing and age is 18
但是这里要注意,如果定义方法时使用的值形式,那么调用的时候,也必须使用值形式,如果定义时使用的是指针形式,那么要调用的时候也要使用结构体地址。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main
import "fmt"
type Person struct {
name string
age int
}
func (self *Person) String() string {
return fmt.Sprintf("Person name is %s and age is %d", self.name, self.age)
}
func main() {
p := Person{"yangyanxing", 18}
pt := &Person{"yyx", 20}
fmt.Println(p) //{yangyanxing 18}
fmt.Println(&p) //Person name is yangyanxing and age is 18
fmt.Println(pt) //Person name is yyx and age is 20
fmt.Println(*pt) //{yyx 20}
}
总结
String()