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

rockdean · · 4799 次点击
这两者的区别在于:**不同的类型实现的方法** 带星号的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
更多评论
如果方法里有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