중첩 된 구조체 초기화


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
그냥 배우고 똑같은 질문을했습니다. 배열 및 맵에 대해서는 요소 유형을 생략 할 수 있지만 중첩 구조체에 대해서는 생략 할 수 있습니다. 비논리적이고 불편합니다. 누군가 이유를 설명 할 수 있습니까?
Peter Dotchev

답변:


177

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

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

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

예 또는 두 번째 유형의 이니셜 라이저 field : value
Pierrick HYMBERT

Proxy어레이 라면 어떨까요?
Ertuğrul Altınboğa

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

나처럼 잊은 사람들을 위해 구조체 속성의 이름을 대문자로 지정하지 않으면 cannot refer to unexported field or method 오류가 발생합니다.
tagaism

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.