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)

运行结果都是:{"ID":1,"Name":"Reds","Colors":["Crimson","Red","Ruby","Maroon"]}

这两种方式 得到的b结果都一样,go是值传递, 第一种是传递指针的拷贝,第二种方式是传递结构体的拷贝。
那么我想问题的问题是Marshall函数内部是如何 屏蔽 这个可以接收不同参数 细节的?

为什么传递指针和结构体都可以实现相同 效果?

go基础不好,感谢 各位指点。