<iframe style="border:1px solid" src="https://wide.b3log.org/playground/b0675af760ca48c4ea794e173f46731c.go?embed=true" width="99%" height="600"></iframe>
上面有两个方法一个是带星号的User, 一个是不带的星号的User,但我始终搞不清,星号在这种情况下应用有什么区别?
这两者的区别在于:**不同的类型实现的方法**
带星号的func (this *User) GetSring() string 是类型*User(就是User的指针类型)实现了GetString方法
不带型号的func (this User) String() string 是类型User实现了GetString方法
**User 和 *User 是不同的类型**,从面向对象的角度可以理解是不同的类
另外一点是,(this *User) 和 (this User)都是它们实现的方法的参数。
从这个角度看,这两个函数和下面两个函数是一样的:
func GetString(this *User) string
func String(this User) string
如果用u.GetString()/u.String()的方式调用时,会自动以对应的类型传参:
```
u := User{}
x := u.GetString() //自动以对应的*User类型传参,和GetString(&u)效果一样
u1 := &User{}
x = u1.String() //自动以对应的User类型传参,和String(*u1)效果一样
```
由于*User和User类型实现了不同的方法(*User实现了GetString() string,User实现了String() string),
它们在类型判断时也会有不同的表现
```
type I1 interface {
GetString() string
}
type I2 interface {
String() string
}
var u User
var i1 I1 = u //会panic, 因为类型User没有实现GetString() string
u1 := &User{}
var i2 I2 = u1//会panic, 因为类型*User没有实现String() string
```
#6
更多评论
```
package main
import (
"fmt"
"strconv"
)
type User struct {
username string
password string
age int32
}
func (this User) Set() {
this.username = "set name"
}
func (this *User) Set2() {
this.username = "set name"
}
func main() {
user := &User{username: "a", password: "aaa", age: 25}
user.Set()
fmt.Println("user:", user)
user2 := &User{username: "a", password: "aaa", age: 25}
user2.Set2()
fmt.Println("user2:", user2)
}
```
运行结果
```
user: username:a password:aaa age:25
user2: username:set name password:aaa age:25
```
可见,带指针的struct函数可修改struct实例,而不带指针的函数只是对实例的拷贝进行操作
#2