go - 指针语义方法如何提供数据?
问题描述
对于以下数据:
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)
解决方案
Encode
得到一个interface{}
参数,所以如果你通过*p
,一个副本p
将被传递,如果你通过p
,一个指针的副本p
将被传递。Encode
在自动取消引用指针的同时使用反射下降树,所以对于这种情况没有什么真正重要的。
推荐阅读
- python - 在同一轴上创建两个标签并填充周末间隙
- dns - Netlify - 我应该对自定义域使用 CNAME 还是 A 记录
- uml - 地铁铁路UML类图
- javascript - 每秒(近 1800 秒)调用 javascript 函数 setTimeout 和 setInterval 有滞后问题
- python - 如何从python中的数据集中删除某些数值?
- reactjs - 混合图像背景的底部
- python - 找出列表元素所有可能方式的差异
- python - 使用 utf-8 进行 .epub 转换的输出格式不正确
- python - 如何检测两个线段(在 3d 空间中)是否相交?
- elasticsearch - ElasticSearch 快照:部分状态的原因