去更新切片迭代错误"不支持索引"

use*_*912 28 go

我正在尝试迭代切片值并更新一个或多个值,通过索引访问它或迭代它们.然后我有以下问题.

package main

import "fmt"

type Member struct {
    Name, Surname string
    Age           int
}
type Members []Member

func main() {
    members1 := Members{
        {"Bob", "Doe", 30},
        {"Jack", "Doe", 30},
        {"John", "Doe", 30},
    }
    members1.ModifyName()
    members1.ModifyAllNames1()
    members1.ModifyAllNames2()
    fmt.Println(members1)
}

func (members *Members) ModifyName() {

    *members[0].Name = "-"
}

func (members *Members) ModifyAllNames1() {

    for i := 0; i < len(*members); i++ {
        *members[i].Name = "-"
    }
}

func (members *Members) ModifyAllNames2() {

    for _, m := range *members {
        m.Name = "-"
    }
}   
Run Code Online (Sandbox Code Playgroud)

然后我收到以下错误:

invalid operation: members[0] (type *Members does not support indexing)
invalid operation: members[i] (type *Members does not support indexing)
Run Code Online (Sandbox Code Playgroud)

Ste*_*erg 61

类型*Members不支持索引,类型Members不支持.

m := make([]Members, 5)
pm := &m

m[:2]     // good
pm[:2]    // bad
(*pm)[:2] // good
Run Code Online (Sandbox Code Playgroud)

http://play.golang.org/p/_26TUBHdDm

package main

import "fmt"

type Member struct {
    Name, Surname string
    Age           int
}
type Members []Member

func main() {
    members1 := Members{
        {"Bob", "Doe", 30},
        {"Jack", "Doe", 30},
        {"John", "Doe", 30},
    }
    members1.ModifyName()
    members1.ModifyAllNames1()
    members1.ModifyAllNames2()
    fmt.Println(members1)
}

func (members *Members) ModifyName() {
    (*members)[0].Name = "-"
}

func (members *Members) ModifyAllNames1() {
    for i := 0; i < len(*members); i++ {
        (*members)[i].Name = "-"
    }
}

func (members *Members) ModifyAllNames2() {
    for _, m := range *members {
        m.Name = "-"
    }
}
Run Code Online (Sandbox Code Playgroud)

  • *成员[0]被编译器解释为*(成员[0]).首先它获取切片的第一个元素,然后应用指针deref.你想要的是首先解析切片,然后得到元素.这可以用(*成员)[0]来完成.它首先将*应用于切片然后进行索引. (20认同)
  • 您的第三个函数ModifyAllNames2()实际上不会修改Name字段 (4认同)

cns*_*nst 6

func (members *Members) ModifyName() {
    *members[0].Name = "-"
}
Run Code Online (Sandbox Code Playgroud)

invalid operation: members[0] (type *Members does not support indexing)

问题在于运算符关联性和/或优先级,尽管我找不到 Golang 规范中明确涵盖的特定情况。

该表达式*members[0].Name似乎等效于*(members[0].Name),因此,为了获得正确的指针引用,您必须在必须取消引用的项周围显式使用一对括号,就像 一样(*members)[0].Name