Подтвердить что ты не робот

Перейти к обновлению итерационной ошибки среза "не поддерживает индексирование"

Я пытаюсь выполнить итерацию по значениям среза и обновить одно или несколько значений, обращаясь к нему по индексу или итерации через них. Тогда у меня есть следующая проблема.

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 = "-"
    }
}   

Затем я получаю следующие ошибки:

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

Ответ 1

Тип *Members не поддерживает индексирование, введите Members.

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

m[:2]     // good
pm[:2]    // bad
(*pm)[:2] // good

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 = "-"
    }
}