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等效,但类型语义不同。我是否需要单独查询接收方语义?如上所述,方法的语义是不相关的,重要的是要传递的值。