初始化嵌套结构


123

我不知道如何初始化嵌套结构。在此处查找示例: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
只是学习去,并有完全相同的问题。您可以忽略数组和映射的元素类型,但不能忽略嵌套结构的元素类型。不合逻辑且不便。有人可以解释为什么吗?
彼得·多切夫

Answers:


177

好吧,有什么特定的原因不使Proxy成为自己的结构?

无论如何,您有2个选择:

正确的方法是,只需将代理移动到其自己的结构,例如:

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

不太正确和丑陋的方法,但仍然有效:

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

1
在第二种方法中,可以避免重复的结构定义吗?
Gaurav Ojha

@GauravOjha并非一直如此,但就像play.golang.org/p/n24BD3NlIR
OneOfOne

我认为使用嵌入式类型更适合is-a关系。
crackerplace

如@sepehr在下面指出的那样,您可以使用点符号直接访问变量。
snassr

如果代理的字段类型为struct怎么办?如何在另一个嵌套结构中初始化它们?
kucinghitam

89

如果您不想为嵌套结构使用单独的结构定义,并且您不喜欢@OneOfOne建议的第二种方法,则可以使用以下第三种方法:

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

您可以在此处检查它:https : //play.golang.org/p/WoSYCxzCF2


8
哇,如何初始化嵌套结构的实际答案。
Max

1
这实际上是相当不错的,但是如果我们可以一行完成,那就更好了!
Gaurav Ojha

1
我一直在寻找不需要 c.Proxy.Address = `127.0.0.1` c.Proxy.Port = `8080` 的方法,有没有一种方法可以在&Configuration{}赋值期间初始化这些值?
Matheus Felipe's

1
您可以使用@MatheusFelipe,但随后必须将Proxy其定义为自己的结构,请参见@OneOfOne的答案中的第一种方法
sepehr

IMO,这比公认的答案要好。
domoarigato


10

您还具有以下选项:

type Configuration struct {
        Val string
        Proxy
}

type Proxy struct {
        Address string
        Port    string
}

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

是或与第二种类型的初始
Pierrick HYMBERT

如果Proxy是数组怎么办?
Ertugrul的Altınboğa

9

当您要实例化在外部程序包中定义的公共类型并且该类型嵌入其他私有类型时,就会出现一个陷阱。

例:

package animals

type otherProps{
  Name string
  Width int
}

type Duck{
  Weight int
  otherProps
}

您如何Duck在自己的程序中实例化a ?这是我能想到的最好的方法:

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

对于那些像我这样忘记的人,用大写字母命名您的struct属性,否则,您将面临cannot refer to unexported field or method 错误。
塔加斯主义

5

您还可以new手动分配使用并初始化所有字段

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

在操场上看:https : //play.golang.org/p/sFH_-HawO_M


2

您可以定义一个结构并在另一个结构中创建其对象,就像我在下面所做的那样:

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

希望它对您有所帮助:)


2

您需要在以下期间重新定义未命名的结构 &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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.