3 回答

TA貢獻2019條經驗 獲得超9個贊
使用 interface{} 表示任何類型,包括指針:
func loadJson(jsonStr []byte, x interface{}) {
json.Unmarshal(jsonStr, x)
}
playground
盡管您可以將 a 分配Configuration給 an interface{},但Configuration值和interface{}值的內存布局是不同的。由于內存布局不同,指向 an 的指針interface{}不能轉換為指向 a 的指針Configuration。在同樣的道理也適用于[]T和[]interface[}。
在 Go 中用戶很少使用指向接口的指針。
關于旁注:您可以使用變量聲明和賦值
var config *Configuration
config = new(Configuration)
或者您可以使用簡短的變量聲明:
config := new(Configuration)
不能同時使用聲明和短聲明,因為它聲明了變量兩次。

TA貢獻1725條經驗 獲得超8個贊
interface{} 已經是一個指針了嗎?
不,一般來說不是[1]。
這里發生了什么可以讓它發揮作用?
考慮以下類型定義:
type Number int
int
并且Number
現在是兩種完全不同的類型。您不能使用 a *int
where a*Number
是預期的;即使它們本質上是相同的,甚至在記憶方面也是如此。
規則是相同的*Configuration
和*interface{}
; 即使它們的內存表示是相同的(事實并非如此)。
為什么它在interface{}
那時起作用?因為接口類型是特殊的;它們是 Go 實現多態的方式。如果實現了所述接口,則任何值都可以在接口值中“裝箱”。
[1] 在幕后,接口值有時包含一個指針,但這是一個實現細節,與此處無關。
- 3 回答
- 0 關注
- 263 瀏覽
添加回答
舉報