아래 질문에 대한 답변 / 기술은 여러 가지가 있습니다.
- golang 구조체에 기본값을 설정하는 방법은 무엇입니까?
- 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
}
NewSomething
, 심지어 필드 Text
와DefaultText
있었으나 결국 구조체 유형을 내 보내지 않습니다 something
.
reflect.New()
하면 특별히 명명 된 팩토리 기능에 대해 알 수 없었습니다. 이 경우 언어 자체가 부족 하여 인터페이스 (라이브러리가 확인할 수있는 인터페이스 ) 만 수행됩니다.
메소드가 구조체를 생성하도록합니다 (생성자 방식).
좋은 디자인은 타입을 익스포트하지 않지만 NewMyType ()과 같은 익스포트 된 생성자 함수를 제공하여 구조체 / 타입을 적절히 초기화하는 것입니다. 또한 구체적인 유형이 아닌 인터페이스 유형을 반환하십시오. 인터페이스에는 다른 사용자가 원하는 모든 것을 포함해야합니다. 그리고 구체적인 유형은 물론 해당 인터페이스를 구현해야합니다.
단순히 형식 자체를 내 보내지 않음으로써 수행 할 수 있습니다. NewSomething 함수와 Text 및 DefaultText 필드를 내보낼 수 있지만 구조체 유형을 내 보내지 마십시오.
자신의 모듈에 맞게 모듈을 사용자 정의하는 또 다른 방법은 구성 구조체를 사용하여 기본값을 설정 하는 것입니다 (링크의 옵션 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 인터페이스를 사용하여 함수 매개 변수 유형을 선언 할 수 있습니다. 이 솔루션에서 볼 수있는 유일한 단점은 인터페이스 정의에서 모든 메소드를 선언해야하지만 어쨌든 좋은 습관이라고 주장 할 수 있습니다.
Votes unit32
아마해야합니다Votes uint32
여러 기본값을 허용하는 태그를 사용하여이를 수행하는 방법이 있습니다.
기본 태그가 default0 및 default1 인 다음과 같은 구조체가 있다고 가정합니다 .
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"`
}