Как заполнить структуру, которая содержит фрагмент структур с неизвестным размером - PullRequest
0 голосов
/ 02 октября 2019

Я пытаюсь обдумать следующую упрощенную версию моей проблемы.

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

Я рассмотрел различные примеры, которые кажутся для более простых версий, где структурапросто содержит фрагмент [] int и т. д.

Кажется, я не могу понять, что мне нужно для инициализации моей структуры / фрагментов.

Срез Swells может иметь произвольную длину, включая пустую.

package main

import (
        "fmt"
)

type Swell struct {
        Slot      uint
        Height    float32
        Period    float32
        Dir       uint
}

type ForecastHour struct {
        Year      uint
        Month     uint
        Day       uint
        Hour      uint
        Swells    []Swell
}

func NewForecastHour() *ForecastHour {
       p := ForecastHour{}
       p.Year  = 2019
       p.Month = 10
       p.Day = 3
       p.Hour = 13


       p.Swells[0] := { Slot: 0, Height: 2.20, Period: 15.5,Dir: 300 }
       p.Swells[1] := { Slot: 1, Height: 1.20, Period: 5.5,Dir: 90 }
       p.Swells[2] := { Slot: 5, Height: 0.98, Period: 7.5,Dir: 180 }

       return &p
}

func main() {
        ThisHour := NewForecastHour()
        fmt.Println(ThisHour)
}

Когда я запускаю вышеупомянутое, я получаю:

./test.go:30:16: non-name p.Swells[0] on left side of :=
./test.go:30:23: syntax error: unexpected {, expecting expression
./test.go:31:8: syntax error: non-declaration statement outside function body

1 Ответ

2 голосов
/ 02 октября 2019

Во-первых, обратите внимание, что вы не можете присвоить значение свойству struct с помощью :=. И чтобы исправить вашу главную проблему, вам просто нужно инициализировать p.Swells

func NewForecastHour() *ForecastHour {
       p := ForecastHour{}
       p.Year  = 2019
       p.Month = 10
       p.Day = 3
       p.Hour = 13
       p.Swells = make([]Swell, 3) // initialize with size 3

       p.Swells[0] = Swell{ Slot: 0, Height: 2.20, Period: 15.5,Dir: 300 }
       p.Swells[1] = Swell{ Slot: 1, Height: 1.20, Period: 5.5,Dir: 90 }
       p.Swells[2] = Swell{ Slot: 5, Height: 0.98, Period: 7.5,Dir: 180 }

       return &p
}

Демо

Если у вас есть произвольное количество добавляемых Swells, вы можете использоватьменее эффективный метод добавления:

p.Swells = []Swell{}
p.Swells = append(p.Swells, Swell{ Slot: 0, Height: 2.20, Period: 15.5,Dir: 300 })
p.Swells = append(p.Swells, Swell{ Slot: 1, Height: 1.20, Period: 5.5,Dir: 90 })
p.Swells = append(p.Swells, Swell{ Slot: 5, Height: 0.98, Period: 7.5,Dir: 180 })

Работает в цикле for.

...