[go] Go 구조체에서 기본값을 설정하는 방법

아래 질문에 대한 답변 / 기술은 여러 가지가 있습니다.

  1. golang 구조체에 기본값을 설정하는 방법은 무엇입니까?
  2. golang에서 구조체를 초기화하는 방법

몇 가지 답변이 있지만 추가 토론이 필요합니다.



답변

하나의 가능한 아이디어는 별도의 생성자 함수를 작성하는 것입니다

//Something is the structure we work with
type Something struct {
     Text string
     DefaultText string
}
// NewSomething create new instance of Something
func NewSomething(text string) Something {
   something := Something{}
   something.Text = text
   something.DefaultText = "default text"
   return something
}


답변

  1. 메소드가 구조체를 생성하도록합니다 (생성자 방식).

    좋은 디자인은 타입을 익스포트하지 않지만 NewMyType ()과 같은 익스포트 된 생성자 함수를 제공하여 구조체 / 타입을 적절히 초기화하는 것입니다. 또한 구체적인 유형이 아닌 인터페이스 유형을 반환하십시오. 인터페이스에는 다른 사용자가 원하는 모든 것을 포함해야합니다. 그리고 구체적인 유형은 물론 해당 인터페이스를 구현해야합니다.

    단순히 형식 자체를 내 보내지 않음으로써 수행 할 수 있습니다. NewSomething 함수와 Text 및 DefaultText 필드를 내보낼 수 있지만 구조체 유형을 내 보내지 마십시오.

  2. 자신의 모듈에 맞게 모듈을 사용자 정의하는 또 다른 방법은 구성 구조체를 사용하여 기본값을 설정 하는 것입니다 (링크의 옵션 5).


답변

Victor Zamanian의 답변 1 옵션의 한 가지 문제는 유형을 내 보내지 않으면 패키지 사용자가 함수 매개 변수 등의 유형으로 선언 할 수 없다는 것입니다. 구조체 예

package candidate
// Exporting interface instead of struct
type Candidate interface {}
// Struct is not exported
type candidate struct {
    Name string
    Votes uint32 // Defaults to 0
}
// We are forced to call the constructor to get an instance of candidate
func New(name string) Candidate {
    return candidate{name, 0}  // enforce the default value here
}

내 보낸 Candidate 인터페이스를 사용하여 함수 매개 변수 유형을 선언 할 수 있습니다. 이 솔루션에서 볼 수있는 유일한 단점은 인터페이스 정의에서 모든 메소드를 선언해야하지만 어쨌든 좋은 습관이라고 주장 할 수 있습니다.


답변

여러 기본값을 허용하는 태그를 사용하여이를 수행하는 방법이 있습니다.

기본 태그가 default0default1 인 다음과 같은 구조체가 있다고 가정합니다 .

type A struct {
   I int    `default0:"3" default1:"42"`
   S string `default0:"Some String..." default1:"Some Other String..."`
}

이제 기본값을 설정할 수 있습니다.

func main() {

ptr := &A{}

Set(ptr, "default0")
fmt.Printf("ptr.I=%d ptr.S=%s\n", ptr.I, ptr.S)
// ptr.I=3 ptr.S=Some String...

Set(ptr, "default1")
fmt.Printf("ptr.I=%d ptr.S=%s\n", ptr.I, ptr.S)
// ptr.I=42 ptr.S=Some Other String...
}

놀이터에서 완성 된 프로그램은 다음과 같습니다. .

더 복잡한 예제에 관심이 있다면 슬라이스와 맵으로 말하면 잔인 함 / 기본값을 살펴보십시오.


답변

에서 https://golang.org/doc/effective_go.html#composite_literals :

이 예제에서 os 패키지에서 파생 된 것처럼 0 값이 충분하지 않고 초기화 생성자가 필요한 경우가 있습니다.

    func NewFile(fd int, name string) *File {
      if fd < 0 {
        return nil
      }
      f := new(File)
      f.fd = fd
      f.name = name
      f.dirinfo = nil
      f.nepipe = 0
      return f
}


답변

type Config struct {
    AWSRegion                               string `default:"us-west-2"`
}


답변