web-dev-qa-db-fra.com

Initialiser une structure imbriquée dans Golang

Je n'arrive pas à comprendre comment initialiser une structure imbriquée. Trouvez un exemple ici: http://play.golang.org/p/NL6VXdHrjh

package main

type Configuration struct {
    Val   string
    Proxy struct {
        Address string
        Port    string
    }
}

func main() {

    c := &Configuration{
        Val: "test",
        Proxy: {
            Address: "addr",
            Port:    "80",
        },
    }

}
85
sontags

Eh bien, une raison spécifique de ne pas faire de proxy sa propre structure?

Quoi qu'il en soit, vous avez 2 options:

Pour ce faire, déplacez simplement le proxy vers sa propre structure, par exemple:

type Configuration struct {
    Val string
    Proxy
}

type Proxy struct {
    Address string
    Port    string
}

func main() {

    c := &Configuration{
        Val: "test",
        Proxy: Proxy{
            Address: "addr",
            Port:    "port",
        },
    }
    fmt.Println(c)
}

La manière la moins convenable et laide mais qui fonctionne toujours:

c := &Configuration{
    Val: "test",
    Proxy: struct {
        Address string
        Port    string
    }{
        Address: "addr",
        Port:    "80",
    },
}
122
OneOfOne

Si vous ne voulez pas utiliser une définition de structure séparée pour la structure imbriquée et que vous n'aimez pas la deuxième méthode suggérée par @OneOfOne, vous pouvez utiliser cette troisième méthode:

package main
import "fmt"
type Configuration struct {
    Val   string
    Proxy struct {
        Address string
        Port    string
    }
}

func main() {
    c := &Configuration{
        Val: "test",
    }

    c.Proxy.Address = `127.0.0.1`
    c.Proxy.Port = `8080`
}

Vous pouvez le vérifier ici: https://play.golang.org/p/WoSYCxzCF2

58
sepehr

Définissez votre structure Proxy séparément, en dehors de Configuration, comme ceci:

type Proxy struct {
    Address string
    Port    string
}

type Configuration struct {
    Val string
    P   Proxy
}

c := &Configuration{
    Val: "test",
    P: Proxy{
        Address: "addr",
        Port:    "80",
    },
}

Voir http://play.golang.org/p/7PELCVsQIc

14
Vitor De Mario

Vous avez cette option aussi:

type Configuration struct {
        Val string
        Proxy
}

type Proxy struct {
        Address string
        Port    string
}

func main() {
        c := &Configuration{"test", Proxy{"addr", "port"}}
        fmt.Println(c)
}
9
Jose

Un piège survient lorsque vous souhaitez instancier un type public défini dans un package externe et que ce type incorpore d'autres types privés.

Exemple:

package animals

type otherProps{
  Name string
  Width int
}

type Duck{
  Weight int
  otherProps
}

Comment instancier une Duck dans votre propre programme? Voici le meilleur que je pourrais trouver:

package main

import "github.com/someone/animals"

func main(){
  var duck animals.Duck
  // Can't instantiate a duck with something.Duck{Weight: 2, Name: "Henry"} because `Name` is part of the private type `otherProps`
  duck.Weight = 2
  duck.Width = 30
  duck.Name = "Henry"
}
5
dvdplm

Vous pouvez définir une structure et créer son objet dans une autre structure, comme je l’ai fait ci-dessous:

package main

import "fmt"

type Address struct {
    streetNumber int
    streetName   string
    zipCode      int
}

type Person struct {
    name    string
    age     int
    address Address
}

func main() {
    var p Person
    p.name = "Vipin"
    p.age = 30
    p.address = Address{
        streetName:   "Krishna Pura",
        streetNumber: 14,
        zipCode:      475110,
    }
    fmt.Println("Name: ", p.name)
    fmt.Println("Age: ", p.age)
    fmt.Println("StreetName: ", p.address.streetName)
    fmt.Println("StreeNumber: ", p.address.streetNumber)
}

J'espère que ça vous a aidé :)

1
Vipin Gupta

Vous devez redéfinir la structure non nommée pendant &Configuration{}

package main

import "fmt"

type Configuration struct {
    Val   string
    Proxy struct {
        Address string
        Port    string
    }
}

func main() {

    c := &Configuration{
        Val: "test",
        Proxy: struct {
            Address string
            Port    string
        }{
            Address: "127.0.0.1",
            Port:    "8080",
        },
    }
    fmt.Println(c)
}

https://play.golang.org/p/Fv5QYylFGAY

1
lizhenpeng

Vous pouvez également allouer en utilisant new et initialiser manuellement tous les champs

package main

type Configuration struct {
    Val   string
    Proxy struct {
        Address string
        Port    string
    }
}

func main() {
    c := new(Configuration)
    c.Val = "test"
    c.Proxy.Address = "addr"
    c.Proxy.Port = "80"
}

Voir dans l'aire de jeu: https://play.golang.org/p/sFH_-HawO_M

0
Ferdy Pruis