- 使用接口给实现类的变量赋值,例一错误;例二正确。
- &与*的不同用法,前者是取地址,后者是引用
&a&aaastring&astring&stringb := &astring&string**b
例一:
package main
import (
"fmt"
)
//声明一个接口
type IUser interface {
GetName() string
SetName(name string)
}
//声明一个User的结构去实现接口
type User struct {
Name string
}
func (a User) GetName() string {
return a.Name
}
func (a User) SetName(name string) {
a.Name = name
}
func main() {
var a IUser //声明a的类型是IUser类型
a = User{"李磊"} //给接口变量赋值
fmt.Println(a.GetName()) //输出:李磊
a.SetName("韩梅梅")
fmt.Println(a.GetName()) //输出:李磊,这里实际想输出的是"韩梅梅"
}
例二:
package main
import (
"fmt"
)
//声明一个接口
type IUser interface {
GetName() string
SetName(name string)
}
//声明一个User的结构去实现接口
type User struct {
Name string
}
func (a User) GetName() string {
return a.Name
}
//要改变对象的值必须用指针
func (b *User) SetName(name string) {
b.Name = name
}
func main() {
var a IUser //声明a的类型是IUser类型
a = &User{"李磊"} //a是指针了
fmt.Println(a.GetName()) //输出:李磊
a.SetName("韩梅梅")
fmt.Println(a.GetName()) //输出:韩梅梅
b := &a
// fmt.Println(b.GetName()) //这一步会报错:b.GetName undefined (type *IUser is pointer to interface, not interface)
c := *b //相当于c=a
c.SetName("小明")
fmt.Println(c.GetName()) //输出:小明
fmt.Println(a == c) //true
fmt.Println(&a == &c) //false
fmt.Println(&a) //变量a的内存地址
fmt.Println(&b) //变量b的内存地址
fmt.Println(&c) //变量c的内存地址
fmt.Println(*b) //解引用,输出b存储的数据(就是c) 输出:&{小明}
//fmt.Println(*a) //编译错误:invalid indirect of a (type IUser)
x := &User{"李磊"}
fmt.Println(*x) //{李磊}
fmt.Println(x) //&{李磊}
}