亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

接口指針作為函數參數

接口指針作為函數參數

Go
慕森王 2021-08-23 16:24:50
這很可能源于對 go 中的 interface{} 的誤解。{} 我有以下代碼type Configuration struct {    Username string}func loadJson(jsonStr []byte, x *Configuration}) {    json.Unmarshal(jsonStr, x)}func main() {    //var config *Configuration    config := new(Configuration)    file, e := ioutil.ReadFile("config.json")    loadJson(file, config)    fmt.Printf("%s\n", config.Username)}它將 json 配置加載到 config 變量中。我想讓 loadJson 函數更抽象并接受任何結構。我認為最好的方法是接受 a *interface{},但是在更改 loadJson 簽名時出現以下錯誤。 ./issue.go:30: cannot use config (type *Configuration) as type *interface {} in argument to loadJson:*interface {} is pointer to interface, not interface而是加載 json 應該是這個func loadJson(jsonStr []byte, x interface{}}) {    json.Unmarshal(jsonStr, x)}interface{} 已經是一個指針了嗎?此外,錯誤消息對我來說沒有意義,配置不是指向接口的指針嗎?此外,如果我更改json.Unmarshal(jsonStr, x)為json.Unmarshal(jsonStr, &x)它仍然可以正常工作。這里發生了什么可以讓它發揮作用?附帶問題但與指針相關,為什么我不能像注釋掉的行(在 main 下)聲明一個指針?
查看完整描述

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)

不能同時使用聲明和短聲明,因為它聲明了變量兩次。


查看完整回答
反對 回復 2021-08-23
?
qq_遁去的一_1

TA貢獻1725條經驗 獲得超8個贊

interface{} 已經是一個指針了嗎?

不,一般來說不是[1]。

這里發生了什么可以讓它發揮作用?

考慮以下類型定義:

type Number int

int并且Number現在是兩種完全不同的類型。您不能使用 a *intwhere a*Number是預期的;即使它們本質上是相同的,甚至在記憶方面也是如此。

規則是相同的*Configuration*interface{}; 即使它們的內存表示是相同的(事實并非如此)。

為什么它在interface{}那時起作用?因為接口類型是特殊的;它們是 Go 實現多態的方式。如果實現了所述接口,則任何值都可以在接口值中“裝箱”。

[1] 在幕后,接口值有時包含一個指針,但這是一個實現細節,與此處無關。


查看完整回答
反對 回復 2021-08-23
  • 3 回答
  • 0 關注
  • 263 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號