l'initialisation d'une structure contenant une tranche de structs dans golang
J'ai un struct que je veux initialiser avec une tranche de structs dans golang, mais je suis en train de voir si il est plus efficace en version d'ajout de chaque nouveau généré struct pour la tranche:
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)
}
- plus efficace comment? Voulez-vous simplement à ignorer la variable tmp? play.golang.org/p/XKg4VouoUI
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
make()
pour allouer de la tranche en "full-size", et ensuite utiliser ungamme
d'itérer et de remplir les numéros:L'essayer sur le Aller De L'Aire De Jeux.
Remarque qu'à l'intérieur de la
for
je n'ai pas créer de nouveaux "cas" de laLuckyNumber
struct, parce que la tranche contient déjà eux; parce que la tranche n'est pas une tranche de pointeurs. Donc, à l'intérieur de lafor
boucle tout ce que nous devons faire est de simplement utiliser la structure de la valeur désignée par le expression d'indextmp[i]
.Vous pouvez utiliser
make()
la façon icza propose, vous pouvez également utiliser de cette façon:De cette façon, vous n'avez pas à allouer de la mémoire pour
tmp
plusieurs fois: il suffit de le faire une fois, lors de l'appel. Mais, contrairement à la version où vous appelleriezmake([]LuckyNumber, countOfLuckyNums)
, ici,tmp
ne contient initialisé valeurs non initialisées, mise à zéro des valeurs. En fonction de votre code, il pourrait faire une différence ou pas.tmp
est vide au départ. Lorsque vous ajoutez à cela, le moteur d'exécution alloue un petit tableau sous-jacent et la valeur en elle. Comme vous continuez à ajouter du texte à la tranche, une fois qu'il atteint la capacité de la répartition de la sous-jacentes de la baie, le moteur d'exécution doit allouer un nouvel ensemble plus grand et passer le tout à partir de la première à la nouvelle. Il a pour ce faire plusieurs fois pour accueillir les répétée ajoute (dans ce cas, de 4 dotations: play.golang.org/p/_ameESD2-o).countOfLuckyNums
dans lemake()
appel, tandis que Fabien version alloue sous-jacente d'un tableau de cette taille, mais qui conserve une longueur de la tranche de 0. Cela peut être important si vous interrompez l'ajout de la séquence de début pour une raison quelconque. Exemple: play.golang.org/p/bIs1jmEhrp