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

}

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

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


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


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

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

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


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


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.