Инициализация среза типа Struct в Golang - PullRequest
2 голосов
/ 01 октября 2019

У меня есть следующая структура в Golang

type mystruct struct {
        Name  string
        Power int
    }

Моя цель - написать функцию, которая принимает в качестве входных данных фрагмент типа * mystuct и возвращает фрагмент типа int, содержащий взятое свойство "Power"из входного среза.

мой код представлен ниже:

package main
import (
    "fmt"
)
func main() {
    obj := make([]*mystruct, 15)
    for i, s := range obj {
        s.Power = i
    }
    fmt.Println(extractpowers(obj))
}
func extractpowers(obj []*mystruct) []int {
    powers := make([]int, len(obj))
    for i, s := range obj {
        powers[i] = s.Power
    }
    return powers

} 

Моя проблема в том, что obj := make([]*mystruct, 15) создает срезы из 15 * указателей mystruc, инициализированных в ноль;что приводит к тому, что код внутри цикла for вызывает панику типа «недопустимая память или разыменование нулевого указателя».

Мой вопрос заключается в том, как правильно и быстрее всего инициализировать фрагмент;(эквивалент var lst = new List (Of mystruct) в .net)

С уважением.

1 Ответ

4 голосов
/ 01 октября 2019

Используйте составной литерал и возьмите его адрес в цикле:

for i := range obj {
    obj[i] = &mystruct{Power: i}
}

Попробуйте его на Go Playground .

...