golang的指针在struct中的应用区别

rockdean · · 4842 次点击
这两者的区别在于:它们是**不同的类型实现的方法** 带星号的**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
更多评论
如果方法里有this.username='aaa',就有区别了
#1
``` 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