首页 > 解决方案 > 指针语义方法如何提供数据?

问题描述

对于以下数据:

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

    }, &Product{
        ID:          2,
        Name:        "Espresso",
    },
}

如果一个method( ToJSON)是用指针语义编写的,如下所示:

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.Encode(p)不同?encoder.Encode(*p)

标签: go

解决方案


Encode得到一个interface{}参数,所以如果你通过*p,一个副本p将被传递,如果你通过p,一个指针的副本p将被传递。Encode在自动取消引用指针的同时使用反射下降树,所以对于这种情况没有什么真正重要的。


推荐阅读