Go Pointers - 通过指针将值附加到切片
Go Pointers - append values to slice via pointer
我有一个结构 ProductData 及其具有切片属性的实例 p :
type ProductInfo struct {
TopAttributes []map[string]interface{}
}
我想按如下方式设置TopAttributes
func (p *ProductInfo) setAttributeData() {
key := "key"
value := "value"
setAttribute(p.TopAttributes, key, value)
}
func setAttribute(p []map[string]interface{}, key string, value interface{}) {
val := map[string]interface{}{
key: value,
}
p = append(p, val)
}
但这似乎不起作用。
但是,当我将方法定义为:
时,还有另一种方法可以正常工作
func (p *ProductInfo) setAttributeData() {
key := "key"
value := "value"
p.setAttribute(key, value)
}
func (p *ProductInfo) setAttribute(key string, value interface{}) {
val := map[string]interface{}{
key: value,
}
p.TopAttributes = append(p.TopAttributes, val)
}
我想知道为什么它不起作用。我的代码没有错误,但是传来的数据是空的。
我正在尝试这样做以使其成为通用函数,因为我有另一个必须以相同方式设置的 BottomAttributes。
append
returns 对附加切片的引用。这是因为如果需要调整大小,它可以指向内存中的新位置。
在您的第一个示例中,您正在更新传递给 setAttribute
函数的变量,仅此而已。当该函数退出时,唯一的引用丢失。
它在第二个示例中有效,因为该变量存在于您的结构中,因此会更新。
您可以使用指针修复第一个版本:
func (p *ProductInfo) setAttributeData() {
key := "key"
value := "value"
setAttribute(&p.TopAttributes, key, value)
}
func setAttribute(p *[]map[string]interface{}, key string, value interface{}) {
val := map[string]interface{}{
key: value,
}
*p = append(*p, val)
}
您正试图附加一个用作函数参数的 map
值,因此它具有局部作用域,只能在函数内访问。因为这是按值而不是指针地址引用的,所以它的访问仅限于它的本地范围。
Map类型是引用类型,如指针或切片,所以参数p
的值为nil;它没有指向初始化的地图。
要将它指向地图,您必须通过它的指针访问:
func (p *ProductInfo) setAttributeData() {
key := "key"
value := "value"
setAttribute(p.TopAttributes, key, value)
}
func setAttribute(p *[]map[string]interface{}, key string, value interface{}) {
val := map[string]interface{}{
key: value,
}
*p = append(*p, val)
}
简而言之,虽然我们可以使用切片来修改源数据,但是对于切片本身,当作为函数的参数时,它只是将一个副本传递给函数。
所以,你的代码是这样的
func test(i int) {
i = i + 1
}
var a int = 3
test(a)
我有一个结构 ProductData 及其具有切片属性的实例 p :
type ProductInfo struct {
TopAttributes []map[string]interface{}
}
我想按如下方式设置TopAttributes
func (p *ProductInfo) setAttributeData() {
key := "key"
value := "value"
setAttribute(p.TopAttributes, key, value)
}
func setAttribute(p []map[string]interface{}, key string, value interface{}) {
val := map[string]interface{}{
key: value,
}
p = append(p, val)
}
但这似乎不起作用。
但是,当我将方法定义为:
时,还有另一种方法可以正常工作 func (p *ProductInfo) setAttributeData() {
key := "key"
value := "value"
p.setAttribute(key, value)
}
func (p *ProductInfo) setAttribute(key string, value interface{}) {
val := map[string]interface{}{
key: value,
}
p.TopAttributes = append(p.TopAttributes, val)
}
我想知道为什么它不起作用。我的代码没有错误,但是传来的数据是空的。 我正在尝试这样做以使其成为通用函数,因为我有另一个必须以相同方式设置的 BottomAttributes。
append
returns 对附加切片的引用。这是因为如果需要调整大小,它可以指向内存中的新位置。
在您的第一个示例中,您正在更新传递给 setAttribute
函数的变量,仅此而已。当该函数退出时,唯一的引用丢失。
它在第二个示例中有效,因为该变量存在于您的结构中,因此会更新。
您可以使用指针修复第一个版本:
func (p *ProductInfo) setAttributeData() {
key := "key"
value := "value"
setAttribute(&p.TopAttributes, key, value)
}
func setAttribute(p *[]map[string]interface{}, key string, value interface{}) {
val := map[string]interface{}{
key: value,
}
*p = append(*p, val)
}
您正试图附加一个用作函数参数的 map
值,因此它具有局部作用域,只能在函数内访问。因为这是按值而不是指针地址引用的,所以它的访问仅限于它的本地范围。
Map类型是引用类型,如指针或切片,所以参数p
的值为nil;它没有指向初始化的地图。
要将它指向地图,您必须通过它的指针访问:
func (p *ProductInfo) setAttributeData() {
key := "key"
value := "value"
setAttribute(p.TopAttributes, key, value)
}
func setAttribute(p *[]map[string]interface{}, key string, value interface{}) {
val := map[string]interface{}{
key: value,
}
*p = append(*p, val)
}
简而言之,虽然我们可以使用切片来修改源数据,但是对于切片本身,当作为函数的参数时,它只是将一个副本传递给函数。 所以,你的代码是这样的
func test(i int) {
i = i + 1
}
var a int = 3
test(a)