go

Inicializar una estructura anidada en Golang



(7)

No puedo descifrar cómo inicializar una estructura anidada. Encuentre un ejemplo aquí: 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", }, } }


Bueno, ¿alguna razón específica para no hacer Proxy su propia estructura?

De todos modos tienes 2 opciones:

La forma correcta, simplemente mueva el proxy a su propia estructura, por ejemplo:

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 manera menos adecuada y fea, pero aún funciona:

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


Debes redefinir la estructura sin nombre durante &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


Defina su estructura Proxy separado, fuera de la Configuration , así:

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

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


Puedes definir una estructura y crear su objeto en otra estructura como he hecho a continuación:

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

Espero que te haya ayudado :)


Si no desea ir con la definición de estructura separada para la estructura anidada y no le gusta el segundo método sugerido por @OneOfOne, puede utilizar este tercer método:

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

Puede verificarlo aquí: https://play.golang.org/p/WoSYCxzCF2


Un problema surge cuando se quiere crear una instancia de un tipo público definido en un paquete externo y ese tipo incrusta otros tipos que son privados.

Ejemplo:

package animals type otherProps{ Name string Width int } type Duck{ Weight int otherProps }

¿Cómo instancias un Duck en tu propio programa? Esto es lo mejor que pude hacer:

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


Usted tiene esta opción también:

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