先說結(jié)論:
Go不同于一般的面向?qū)ο笳Z言,
Object.setKey1(string) 并不一定會改變Key1的值
比如:
Func (O Object)setKey1(value string){
O.key=value
}
Func (O *Object)setKey1(value string){
O.key=value
}
上面的只是值拷貝,是的伤哺,真的只是值拷貝燕侠。完整的者祖,我寫了如下代碼:
package main
type ttt1 struct {
A1 string
}
func (t ttt1)setA1() {
t.A1="666"
}
func (t *ttt1)set2A1() {
t.A1="777"
}
func main() {
var t ttt1
t.set2A1()
println(t.A1)
t.setA1()
println(t.A1)
}
注:最后輸出為
777
777
而不是
777
666
還有個問題就是接口的賦值立莉,如果
interface{
set2A1()
}
第一個Oject里是 func (o object)set2A1()
第一個Oject里是 func (o *object2)set2A1()
這么寫編譯器都不讓過,因為沒有意思七问,一個方法是值傳遞蜓耻,一個方法是地址傳遞。
我上一段代碼:
package main
type ttt1 struct {
A1 string
}
type ttt2 struct {
A1 string
}
type IN interface {
set2A1()
}
func (t ttt1) setA1() {
t.A1 = "666"
}
func (t *ttt1) set2A1() {
t.A1 = "777"
}
func (t *ttt2) set2A1() {
t.A1 = "777"
}
func main() {
var t1 ttt1
var t2 ttt2
var i IN
i = t1
i.set2A1()
println(t1.A1)
i = t2
i.set2A1()
println(t2.A1)
}
Golang的這種特性械巡,也就不難理解指針滿天飛了刹淌。
我覺得這樣僅僅是表面上很好!反正有GC讥耗,也不用考慮野指針的問題有勾。
但是,比如有研究一個庫的內(nèi)容也好古程,研究前人先的代碼也好蔼卡。
一個interface里塞了2個東西,這兩個東西里又有別的函數(shù)挣磨,前后瞎搞胡搞雇逞,再想搞什么值傳遞、引用傳遞就很麻煩了茁裙。
interface的賦值塘砸,個人覺得真的是一個麻煩的東西,自己的代碼里晤锥,最好只是提供一個簡潔的interface暴露出去掉蔬。別指望著你的interface成了標(biāo)準(zhǔn),別人寫兩函數(shù)再實現(xiàn)你的interface矾瘾。