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.