鍍金池/ 問答/GO/ golang函數(shù)傳遞指針和傳遞結(jié)構(gòu)體,函數(shù)內(nèi)部是如何屏蔽細(xì)節(jié)的?

golang函數(shù)傳遞指針和傳遞結(jié)構(gòu)體,函數(shù)內(nèi)部是如何屏蔽細(xì)節(jié)的?

func main(){

    type ColorGroup struct {
        ID     int
        Name   string
        Colors []string
    }
    group := ColorGroup{
        ID:     1,
        Name:   "Reds",
        Colors: []string{"Crimson", "Red", "Ruby", "Maroon"},
    }
//第一種方式
    b, err := json.Marshal(&group)
//第二種方式
    b, err := json.Marshal(group)
    if err != nil {
        fmt.Println("error:", err)
    }
    os.Stdout.Write(b)
}

//第一種方式

b, err := json.Marshal(&group)

//第二種方式

b, err := json.Marshal(group)

運行結(jié)果都是:{"ID":1,"Name":"Reds","Colors":["Crimson","Red","Ruby","Maroon"]}

這兩種方式 得到的b結(jié)果都一樣,go是值傳遞, 第一種是傳遞指針的拷貝,第二種方式是傳遞結(jié)構(gòu)體的拷貝。
那么我想問題的問題是Marshall函數(shù)內(nèi)部是如何 屏蔽 這個可以接收不同參數(shù) 細(xì)節(jié)的?

為什么傳遞指針和結(jié)構(gòu)體都可以實現(xiàn)相同 效果?

go基礎(chǔ)不好,感謝 各位指點。

回答
編輯回答
祈歡
  • 通過反射可以知道入?yún)⒌降资莻€什么Kind。
  • 結(jié)構(gòu)體指針和結(jié)構(gòu)體,對Marshal函數(shù)來說也沒什么區(qū)別,Elem函數(shù)可以通過結(jié)構(gòu)體指針訪問到指針指向的結(jié)構(gòu)體Value。
2018年6月17日 03:45