2017-03-03 6 views
2

Ich habe eine Struktur, die ich mit einer Scheibe von Strukturen in Golang initialisieren möchte, aber ich versuche herauszufinden, ob es eine effizientere Version von jedem neu erstellten Anhängen gibt Struktur zur Schicht:Initialisierung einer Struktur, die eine Scheibe von Strukturen in Golang

package main 

import (
    "fmt" 
    "math/rand" 
) 

type LuckyNumber struct { 
    number int 
} 

type Person struct { 
    lucky_numbers []LuckyNumber 
} 

func main() { 
    count_of_lucky_nums := 10 
    // START OF SECTION I WANT TO OPTIMIZE 
    var tmp []LuckyNumber 
    for i := 0; i < count_of_lucky_nums; i++ { 
     tmp = append(tmp, LuckyNumber{rand.Intn(100)}) 
    } 
    a := Person{tmp} 
    // END OF SECTION I WANT TO OPTIMIZE 
    fmt.Println(a) 
} 
+0

effizienter wie? Möchten Sie nur die Variable tmp überspringen? https://play.golang.org/p/XKg4VouoUI – JimB

Antwort

6

Sie können make() verwenden, um die Scheibe in „Full-size“, zuzuordnen und dann ein for range verwenden, um über sie zu durchlaufen und die Zahlen füllen:

tmp := make([]LuckyNumber, 10) 
for i := range tmp { 
    tmp[i].number = rand.Intn(100) 
} 
a := Person{tmp} 
fmt.Println(a) 

Ausprobieren auf der Go Playground.

Beachten Sie, dass innerhalb der for ich nicht neue "Instanzen" der LuckyNumber-Struktur erstellt habe, weil die Scheibe sie bereits enthält; weil die Scheibe keine Scheibe von Zeigern ist. Also innerhalb der for Schleife müssen wir nur den Strukturwert verwenden, der durch index expressiontmp[i] gekennzeichnet ist.

2

können Sie verwenden make() den Weg icza schlägt, können Sie es auch auf diese Weise verwenden:

tmp := make([]LuckyNumber, 0, countOfLuckyNums) 
for i := 0; i < countOfLuckyNums; i++ { 
    tmp = append(tmp, LuckyNumber{rand.Intn(100)}) 
} 
a := Person{tmp} 
fmt.Println(a) 

Auf diese Weise müssen Sie keinen Speicher reservieren für tmp mehrmals: Sie tun es nur einmal, beim Aufruf make. Aber im Gegensatz zu der Version, in der Sie make([]LuckyNumber, countOfLuckyNums) aufrufen würden, enthält tmp nur initialisierte Werte, nicht nicht initialisierte, auf Null gesetzte Werte. Abhängig von Ihrem Code kann es einen Unterschied machen oder nicht.

+1

Ich denke, Ihre Antwort funktioniert auch, aber warum würde die andere Antwort Speicher für tmp mehr als einmal zuweisen? – mgoldwasser

+1

Die Scheibe 'tmp' ist anfangs leer. Wenn Sie es zum ersten Mal anhängen, weist die Laufzeitumgebung ein kleines zugrunde liegendes Array zu und legt den Wert darin ab. Wenn Sie mit dem Slice fortfahren, sobald die Kapazität des zugewiesenen zugrunde liegenden Arrays erreicht ist, muss die Laufzeitumgebung ein neues größeres Array zuweisen und alles vom ersten zum neuen verschieben. Es muss dies mehrmals tun, um die wiederholten Anhängen zu berücksichtigen (in diesem Fall 4 Zuordnungen: https://play.golang.org/p/_ameESD2-o). – Kaedys

+2

Oh, und die andere Antwort vermeidet diese wiederholte Zuweisung auch (Fabien bezog sich auf Ihre Version im OP mit dieser Bemerkung). Die andere Antwort legt jedoch die Länge des Slices auf "countOfLuckyNums" im 'make()' Call fest, während Fabiens Version ein darunter liegendes Array dieser Größe zuordnet, aber eine Slice-Länge von 0 beibehält. Dies kann wichtig sein, wenn Sie Unterbrechen Sie die Append-Sequenz aus irgendeinem Grund vorzeitig. Beispiel: https://play.golang.org/p/bIs1jmEhrp – Kaedys

Verwandte Themen