2014-04-21 2 views
1

내 개체의 모든 필드를 명시 적으로 초기화하는 개체 이니셜 라이저가 내 코드에 있습니다. 그러나 필자의 경우 매개 변수의 대부분은 적절한 기본값을 가지고 있으므로이를 사용하고 싶습니다.골란에서 가장 유연한 함수 서명

나는 보통 키워드 인수 또는 기본값의 조합을 사용하며 내 __init__ 메서드에는 유효성 검사 논리가 포함되어 있으므로 개체 초기화에 제로 구성 원칙을 사용할 수 있습니다. 예 :

class Foo: 
    """This class designed to show zero configuration 
    principle in action""" 
    def __init__(self, mandatory, optional=None, **kwargs): 
     self.__field1 = mandatory 
     self.__field2 = optional or make_default2() 
     if 'bar' in kwargs: 
      self.__field3 = kwargs['bar'] 
     else: 
      self.__field3 = make_default3() 


f = Foo('mondatory', bar=Bar()) 

Go 또는 키워드 매개 변수 또는 함수 오버로드에는 기본값이있는 매개 변수가 없습니다. 그 때문에 유연한 초기화 코드를 작성하는 것은 어렵습니다 (일반적으로 그러한 코드의 성능은별로 신경 쓰지 않습니다). Go에 그러한 코드를 작성하는 가장 관용적 인 방법을 찾고 싶습니다. 어쩌면 런타임 유형 리플렉션과 맵의 일부 조합이 작업을 수행 할 것입니다. 어떻게 생각하십니까? 이동에서 새로 할당 된 메모리는 항상 제로가되기 때문에, 관용적 인 방법에 의해이 사실을 명시 적으로 사용할 수 있도록하는 것입니다

+1

프로그래밍 언어로 뭔가를하는 관용적 인 방법은 "의견 기반"이 아닙니다! – Lazin

+0

Rob Pike는 의견이 아닙니다. Rob Pike는 언어를 만든 사람 중 한 명입니다. – fuz

+0

그래서 뭐? 나는 언어에 대해 논쟁하지 않고, 단지이 언어에서 공통적 인 관용어에 대해 묻습니다. 그런데이 관용구는 언어에 의해 창조자에 의해 돌이키지 않습니다. 이것이 어떻게 의견을 바탕으로 할 수 있습니까? – Lazin

답변

4

:

  • 이 당신의 구조체를 설계 제정신 제로 복합 리터럴
  • 을 사용
  • 값이

효과적인 이동의 다음 섹션을 살펴 보자 매우를 들어 http://golang.org/doc/effective_go.html#data

을 복잡한 경우에는 구성 구조체 (http://joneisen.tumblr.com/post/53695478114/golang-and-default-values의 옵션 3)가 사용되며 기본값이있는 구성 인스턴스를 초기화하는 NewConfigStruct()과 함께 사용되기도합니다. 사용자는 기본 인스턴스를 생성하고 원하는 필드를 설정 한 다음 생성중인 실제 구조체의 New 함수에 전달합니다.

+1

Rob Pike의 다른 옵션 : http://commandcenter.blogspot.com/2014/01/self-referential-functions-and-design.html – lnmx