Initialisieren Sie eine verschachtelte Struktur

123

Ich kann nicht herausfinden, wie eine verschachtelte Struktur initialisiert wird. Ein Beispiel finden Sie hier: 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",
        },
    }

}
sontags
quelle
1
Einfach lernen gehen und hatte genau die gleiche Frage. Sie können Elementtypen für Arrays und Maps weglassen, jedoch nicht für verschachtelte Strukturen. Unlogisch und unpraktisch. Kann jemand erklären warum?
Peter Dotchev

Antworten:

176

Gibt es einen bestimmten Grund, Proxy nicht zu einer eigenen Struktur zu machen?

Auf jeden Fall haben Sie 2 Möglichkeiten:

Verschieben Sie den Proxy auf die richtige Weise einfach in seine eigene Struktur, zum Beispiel:

type Configuration struct {
    Val string
    Proxy Proxy
}

type Proxy struct {
    Address string
    Port    string
}

func main() {

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

Der weniger richtige und hässliche Weg funktioniert aber immer noch:

c := &Configuration{
    Val: "test",
    Proxy: struct {
        Address string
        Port    string
    }{
        Address: "addr",
        Port:    "80",
    },
}
OneOfOne
quelle
1
Können wir bei der zweiten Methode die Definition der sich wiederholenden Struktur vermeiden?
Gaurav Ojha
@ GauravOjha nicht den ganzen Weg, aber so etwas wie play.golang.org/p/n24BD3NlIR
OneOfOne
Ich denke, die Verwendung eines eingebetteten Typs ist eher für eine Beziehung geeignet.
Crackerplace
Wie unten von @sepehr ausgeführt, können Sie direkt mit der Punktnotation auf die Variablen zugreifen.
Snassr
Was ist, wenn der Proxy ein Feld mit struct als Typ hat? Wie initialisiere ich sie in einer anderen verschachtelten Struktur?
Kucinghitam
89

Wenn Sie keine separate Strukturdefinition für verschachtelte Strukturen verwenden möchten und die von @OneOfOne vorgeschlagene zweite Methode nicht mögen, können Sie diese dritte Methode verwenden:

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`
}

Sie können dies hier überprüfen: https://play.golang.org/p/WoSYCxzCF2

sepehr
quelle
8
Wow, eine aktuelle Antwort auf die Frage, wie verschachtelte Strukturen initialisiert werden können.
Max
1
Das ist eigentlich ziemlich gut, wäre aber besser gewesen, wenn wir es in einer Zeile machen könnten!
Gaurav Ojha
1
Ich habe nach einer Möglichkeit gesucht, die Sie nicht benötigen würden. c.Proxy.Address = `127.0.0.1` c.Proxy.Port = `8080` Gibt es eine Möglichkeit, diese Werte während der &Configuration{}Zuweisung zu initialisieren ?
Matheus Felipe
1
@MatheusFelipe können Sie, aber dann müssen Sie Proxyals eigene Struktur definieren, siehe erste Methode in der Antwort von @OneOfOne
September
IMO, das ist besser als die akzeptierte Antwort.
domoarigato vor
14

Definieren Sie Ihre ProxyStruktur separat außerhalb von Configuration:

type Proxy struct {
    Address string
    Port    string
}

type Configuration struct {
    Val string
    P   Proxy
}

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

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

Vitor De Mario
quelle
Was ist, wenn P Proxyes sich um ein Array handelt?
Ertuğrul Altınboğa
10

Sie haben diese Option auch:

type Configuration struct {
        Val string
        Proxy
}

type Proxy struct {
        Address string
        Port    string
}

func main() {
        c := &Configuration{"test", Proxy{"addr", "port"}}
        fmt.Println(c)
}
Jose
quelle
Ja oder das gleiche mit dem zweiten Typ von Initialisiererfeld : Wert
Pierrick HYMBERT
Was ist, wenn Proxyes sich um ein Array handelt?
Ertuğrul Altınboğa
9

Ein Problem tritt auf, wenn Sie einen öffentlichen Typ instanziieren möchten, der in einem externen Paket definiert ist, und dieser Typ andere Typen einbettet, die privat sind.

Beispiel:

package animals

type otherProps{
  Name string
  Width int
}

type Duck{
  Weight int
  otherProps
}

Wie instanziieren Sie ein Duckin Ihrem eigenen Programm? Hier ist das Beste, was ich mir vorstellen kann:

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"
}
dvdplm
quelle
Wenn Sie wie ich vergessen haben, benennen Sie Ihre Strukturattribute mit Großbuchstaben. Andernfalls treten cannot refer to unexported field or method Fehler auf.
Tagaismus
5

Sie können auch newalle Felder manuell zuweisen und initialisieren

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"
}

Siehe auf dem Spielplatz: https://play.golang.org/p/sFH_-HawO_M

Ferdy Pruis
quelle
2

Sie können eine Struktur definieren und ihr Objekt in einer anderen Struktur erstellen, wie ich es unten getan habe:

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)
}

Hoffe es hat dir geholfen :)

Vipin Gupta
quelle
2

Sie müssen die unbenannte Struktur während neu definieren &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

lizhenpeng
quelle