代码之家  ›  专栏  ›  技术社区  ›  overexchange

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

go
  •  1
  • overexchange  · 技术社区  · 4 年前

    以下数据:

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

    如果一种方法( 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) 在具有指针语义的方法中?

    1 回复  |  直到 4 年前
        1
  •  2
  •   Burak Serdar    4 年前

    Encode 得到一个 interface{} 争论,所以如果你通过 *p ,一份副本 p 如果你通过,就会通过 p ,指向的指针副本 p 将通过。 编码 使用反射下降树,同时自动取消指针引用,因此在这种情况下没有什么真正重要的。