實體類型T
var i T
值拷貝傳遞後,方法拿到的是i的值拷貝,因此可能的方法包括所有接收者為T型的函數。原始的T型變數不可能被修改
指向實體類型的指標
var i *T
值拷貝傳遞後,方法拿到的是指向T型變數的指標i,因此可能的方法包括所有接收者為*T的函數,修改“*i”時會修改原始的T型變數
由於拿到i後,還可以通過“v = *i”來產生一個等值拷貝的T型變數
因此本類指標的方法還能包括所有接收者為T型的函數,自然原始變數也不會被修改
Go規範的英文原文是:
Such a function indirects through the receiver to create a value to pass as the receiver to the underlying method;
the method does not overwrite the value whose address is passed in the function call.
感覺是這個意思:
func(tv *T, a int) int {
var v
v = *tv // 在函數的開頭產生了一個局部變數v
return func_real(v, a) // 餘下的代碼使用局部變數v,而不是“*tv”所指向的值
}
interface介面類型
var i I
此刻的i完全不同於實體變數或其指標
i本質上是一指標,可以指向任何包含了介面I的變數
i的方法就是介面I包含的方法
type 軟體工程師 interface {
java編程()
go編程()
加班()
寫文檔()
}
type 產品設計師 interface {
UI設計()
繪畫()
}
interface變數
可能是一個指標,可以指向任何實現了該interface的實體,而不管實體本身是怎樣的
var i 軟體工程師 // 以後 i 可以指向任何軟體工程師,可能是任何實體,不局限於人
i = 小明 // 或小王、火星人、機器人、一條聰明的狗,只要會java和go編程,會寫文檔會加班
var j 產品設計師 // 以後 j 可以指向任何產品設計師,可能是任何實體,不局限於人
j = 小張 // 也可能是小明,或其他任何人,或動物或狗,只要懂UI設計,懂繪畫