golang Назначение значения существующему элементу в срезе срезов (2d срез) - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть фрагмент, который состоит из фрагментов типа string. Я хотел бы иметь возможность назначать значения отдельным элементам этого среза, не обязательно по порядку. Затем, позже, я хотел бы иметь возможность изменить значение любого конкретного элемента. Я прочитал посты по тому же вопросу с ломтиками, но не могу понять, как применить это к ломтикам ломтиков. Рассмотрим этот код:

package main

import (
    "fmt"
    "strconv"
)

type aRow []string
type aGrid struct {
    col []aRow
}

func main() {
    var c aGrid
    r := make(aRow, 4) // each row will have 4 elements
    for i := 0; i < 3; i++ {
        c.col = append(c.col, r) // there will be 3 rows
    }
    i, j := 1, 2
    c.col[i][j] = "i=" + strconv.Itoa(i) + "  j=" + strconv.Itoa(j)

    fmt.Println("c= ", c)
    // c=  {[[  i=1  j=2 ] [  i=1  j=2 ] [  i=1  j=2 ]]}
}

Я хочу присвоить строку j-му элементу i-го среза c, но она назначает строку j-му элементу каждого среза c.

Я пытался получить значение поддержки внутреннего среза, например

i, j := 1, 2
    c.col[i][j].value = "i=" + strconv.Itoa(i) + "  j=" + strconv.Itoa(j)

//  yields "c.col[i][j].value undefined (type string has no field or method value)"

, и указателей, таких как

    p := &c.col[i][j]
    p.value = "i=" + strconv.Itoa(i) + "  j=" + strconv.Itoa(j)

// yields "p.value undefined (type *string has no field or method value)"

Чего мне не хватает?

1 Ответ

0 голосов
/ 26 апреля 2020

Вы добавляете одну и ту же строку r для каждого столбца.

c.col = append(c.col, r)

Таким образом, каждый столбец имеет одинаковую строку r, поэтому набор в одну строку означает набор в каждой строке.

Создать новую строку для каждого столбца.

for i := 0; i < 3; i++ {
    r := make(aRow, 4) // each row will have 4 elements
    c.col = append(c.col, r) // there will be 3 rows
}
...