<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()**的方式调用这两个方法时,golang会自动以对应的类型传参:
```
u := User{}
x := u.GetString() //自动以对应的*User类型传参,和GetString(&u)效果一样
u1 := &User{}
x = u1.String() //自动以对应的User类型传参,和String(*u1)效果一样
```
由于***User**和**User**类型实现了不同的方法, 它们在类型判断时也会有不同的表现:
```
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
```
#7
更多评论
```
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