package main
import (
"fmt"
)
type Man struct {
name string
age int
phone string
}
//A Man method to say hi
func (h Man) SayHi() {
fmt.Printf("Hi, I am %s you can call me on %s\n", h.name, h.phone)
}
//A Man can sing a song
func (h Man) Sing(lyrics string) {
fmt.Println("La la la la...", lyrics)
}
// Interface Human is implemented by man
// because it contains methods implemented by them.
type Human interface {
SayHi()
Sing(lyrics string)
}
func main() {
mike := Man{"Mike", 25, "222-222-XXX"}
var human Human
human = mike
// 断言
person := human.(Man)
person.name = "salamander"
fmt.Println(mike, person)
}
输出结果是:
{Mike 25 222-222-XXX} {salamander 25 222-222-XXX}
接口赋值是值传递?
我觉得这个问题非常有意思,晚上也花了点时间研究一下。我觉得问题不在于接口赋值,而在于赋值。
我简单地修改了一点代码,先看看这种情况:
输出:
我们再看看如果是java会得到什么样的结果:
输出是这样的:
可以看出,在java当中,对象赋值是按引用赋值的。但而在go中,结构体赋值应该是按值赋值的,为了说明这点,请往下看。
这个问题的关键在于:
和
中的
mike
,human
,person
都不是同一个引用。为了说明这点,下面的代码将输出每个变量的内存地址:
输出:
可见都是不同的内存地址。综上所述,不仅仅是接口赋值,普通的赋值也是按值赋值的。