英文:
How to initialize a nested struct?
问题
我无法弄清楚如何初始化嵌套结构。在这里找到一个示例:
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: struct {
Address string
Port string
}{
Address: "addr",
Port: "80",
},
}
}
英文:
I cannot figure out how to initialize a nested struct. Find an example here:
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
得分: 256
好的,以下是翻译好的内容:
好的,有没有特定的原因不将Proxy作为自己的结构体?
无论如何,你有两个选项:
第一种正确的方式是将Proxy移动到自己的结构体中,例如:
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",
},
}
英文:
Well, any specific reason to not make Proxy its own struct?
Anyway you have 2 options:
The proper way, simply move proxy to its own struct, for example:
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)
}
The less proper and ugly way but still works:
c := &Configuration{
Val: "test",
Proxy: struct {
Address string
Port string
}{
Address: "addr",
Port: "80",
},
}
答案2
得分: 172
如果您不想为嵌套结构使用单独的结构定义,并且不喜欢@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
英文:
If you don't want to go with separate struct definition for nested struct and you don't like second method suggested by @OneOfOne you can use this third method:
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`
}
You can check it here: https://play.golang.org/p/WoSYCxzCF2
答案3
得分: 16
请注意,我将为您翻译以下内容:
将您的Proxy
结构体单独定义在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",
},
}
请参考 http://play.golang.org/p/7PELCVsQIc
英文:
Define your Proxy
struct separately, outside of Configuration
, like this:
type Proxy struct {
Address string
Port string
}
type Configuration struct {
Val string
P Proxy
}
c := &Configuration{
Val: "test",
P: Proxy{
Address: "addr",
Port: "80",
},
}
答案4
得分: 12
你还有这个选项:
type Configuration struct {
Val string
Proxy
}
type Proxy struct {
Address string
Port string
}
func main() {
c := &Configuration{"test", Proxy{"addr", "port"}}
fmt.Println(c)
}
英文:
You have this option also:
type Configuration struct {
Val string
Proxy
}
type Proxy struct {
Address string
Port string
}
func main() {
c := &Configuration{"test", Proxy{"addr", "port"}}
fmt.Println(c)
}
答案5
得分: 11
你也可以使用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"
}
在playground中查看:https://play.golang.org/p/sFH_-HawO_M
英文:
You also could allocate using new
and initialize all fields by hand
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"
}
See in playground: https://play.golang.org/p/sFH_-HawO_M
答案6
得分: 9
一个陷阱出现在你想要实例化一个外部包中定义的公共类型,并且该类型嵌入了其他私有类型的情况下。
示例:
package animals
type otherProps{
Name string
Width int
}
type Duck{
Weight int
otherProps
}
如何在你自己的程序中实例化一个 Duck
?这是我能想到的最好方法:
package main
import "github.com/someone/animals"
func main(){
var duck animals.Duck
// 不能使用 something.Duck{Weight: 2, Name: "Henry"} 实例化一个 duck,因为 `Name` 是私有类型 `otherProps` 的一部分
duck.Weight = 2
duck.Width = 30
duck.Name = "Henry"
}
英文:
One gotcha arises when you want to instantiate a public type defined in an external package and that type embeds other types that are private.
Example:
package animals
type otherProps{
Name string
Width int
}
type Duck{
Weight int
otherProps
}
How do you instantiate a Duck
in your own program? Here's the best I could come up with:
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"
}
答案7
得分: 7
你需要重新定义&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
英文:
You need to redefine the unnamed struct during &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)
}
答案8
得分: 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)
}
希望对你有帮助
英文:
You can define a struct and create its object in another struct like i have done below:
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)
}
Hope it helped you
答案9
得分: 1
包 main
类型 Proxy 结构体 {
地址 string
端口 string
}
类型 Configuration 结构体 {
Proxy
值 string
}
主函数 main() {
c := &Configuration{
值: "test",
Proxy: Proxy {
地址: "addr",
端口: "80",
},
}
}
英文:
package main
type Proxy struct {
Address string
Port string
}
type Configuration struct {
Proxy
Val string
}
func main() {
c := &Configuration{
Val: "test",
Proxy: Proxy {
Address: "addr",
Port: "80",
},
}
}
答案10
得分: 0
当你的配置是全局的时候,你可以这样做:
package main
var Configuration struct {
Val string
Proxy struct {
Address string
Port string
}
}
func main() {
Configuration.Val = "test"
Configuration.Proxy.Address = "addr"
Configuration.Proxy.Port = "80"
}
这段代码定义了一个名为Configuration
的结构体变量,其中包含了Val
和Proxy
两个字段。Proxy
字段又包含了Address
和Port
两个字段。通过给这些字段赋值,你可以设置全局配置的值。在main
函数中,示例代码给Val
、Proxy.Address
和Proxy.Port
分别赋了相应的值。
英文:
When your configuration is something global, you can do it this way:
package main
var Configuration struct {
Val string
Proxy struct {
Address string
Port string
}
}
func main() {
Configuration.Val = "test"
Configuration.Proxy.Address = "addr"
Configuration.Proxy.Port = "80"
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论