Go 指针语义方法如何提供数据?

Go 指针语义方法如何提供数据?,go,Go,有关以下数据: var productList = []*Product{ &Product{ ID: 1, Name: "Latte", }, &Product{ ID: 2, Name: "Espresso", }, } 如果methodToJSON是用指针语义编写的,如下所示: p

有关以下数据:

var productList = []*Product{
    &Product{
        ID:          1,
        Name:        "Latte",

    }, &Product{
        ID:          2,
        Name:        "Espresso",
    },
}
如果methodToJSON是用指针语义编写的,如下所示:

package data

type Products []*Product

func (p *Products) ToJSON(w io.Writer) error {
    encoder := json.NewEncoder(w)
    return encoder.Encode(p)
}

func GetProducts() Products {
    return productList
}
使用指针语义,我们不会创建数据的副本。调用以下代码后:

productList := data.GetProducts()
productList.TOJSON()

encoder.Encodep在具有指针语义的方法中与encoder.Encode*p有何不同?

Encode获取一个接口{}参数,因此如果传递*p,将传递p的副本,如果传递p,将传递指向p的指针的副本。Encode在自动取消引用指针的同时使用反射来降低树,因此在这种情况下没有什么真正重要的。

再查询一次,如果没有类型定义type Products[]*Product,那么如何将接收器语义语法编写为指针语义?p*[]*产品不起作用。说明:其类型必须是已定义的类型T或指向已定义类型T的指针。T称为接收器基类型。相对于您的答案,接收器基类型不能是指针或接口类型:在这种情况下,Encode实际上是延迟指针。但一般来说,传递*p不同于我说过的pAs:如果你把p传递给一个接口,你会传递它的一个副本。一般来说,这是不同的。编码不在乎。Re:pointers:func*Products-ToJSONio.Writer方法与func-ToJSON*Products、io.Writer等效,但类型语义不同。我是否需要单独查询接收方语义?如上所述,方法的语义是不相关的,重要的是要传递的值。