登录
首页 >  Golang >  Go问答

从 Slice 元素和 Map 元素中的结构值调用指针接收器方法之间的区别

来源:stackoverflow

时间:2024-02-20 11:45:24 101浏览 收藏

从现在开始,我们要努力学习啦!今天我给大家带来《从 Slice 元素和 Map 元素中的结构值调用指针接收器方法之间的区别》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到等等知识点,如果在阅读本文过程中有遇到不清楚的地方,欢迎留言呀!我们一起讨论,一起学习!

问题内容

我用 struct a 编写了指针接收器方法并创建了两个函数

  1. 期望 a 类型切片作为参数并且
  2. 期望 map[int]a 类型 map 作为参数。

两者都遍历值并调用a的pinter接收器方法。但是当它在map中调用时,出现下面提到的编译错误。切片元素值和映射值都是main.a

./main.go:28:8: cannot call pointer method on aa[k]
./main.go:28:8: cannot take the address of aa[k]

有编译错误的代码已注释,代码如下。

package main

type A struct {
    I int
}

func (a *A) Add(i int)  {
    a.I += i
}

func main()  {
    aa2 := []A{{I:5}}
    testSlice(aa2, 10)
    //aa1 := map[int]A{
    //  5: {I:5},
    //}
    //testMap(aa1, 10)
}

func testSlice(aa []A, i int)  {
    for k := range aa {
        aa[k].Add(i)
    }
}

//func testMap(aa map[int]A, i int)  {
//  for k := range aa {
//      aa[k].Add(i)
//  }
//}

未注释的代码在这里

请帮我解决这个问题,为什么会发生这个编译错误?


正确答案


在 go 中,映射值是不可寻址的。这意味着您无法获取指向映射值(aa[k])的指针,因此您无法调用该值上具有指针接收器的方法。

解决方法如下:

for k := range aa {
        e := aa[k]
        e.Add(i)
        aa[k] = e
    }

本篇关于《从 Slice 元素和 Map 元素中的结构值调用指针接收器方法之间的区别》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>