2

나는 학습을 위해 연락 신청을하고있다. 나는 NewContact()가있다.골란 Variadic 생성자 함수? Golang에 사람 연락처를 만드시겠습니까?

// Contact - defines the fields of an entire Contact 
type Contact struct { 
    Title  string 
    FirstName string 
    LastName string 
    HomePhone string 
    WorkPhone string 
    Mobile string 
    Address *Address 
    Email  string 
}  
// NewContact - Creates a new contact 
func NewContact(first string, last string) *Contact { 
    c := &Contact{} 
    c.FirstName = first 
    c.LastName = last 

    return c 

} 

이것은 작동하지만 .... 나는 이름과 성을 요구할 수 있지만 어떻게 다른 모든 필드 인수를 선택적으로 만들 수 있습니까? 미리 감사드립니다.

+0

당신은 그것을 가변 기능을 만들 수 있지만, 발신자 어떤 각 불분명 것 인수는 단일 가변 인수로 노출 될 것이기 때문에 인수가있었습니다. 그 이외에는 Go에 "선택적"인수를 사용할 수있는 방법이 없습니다. – Adrian

+1

귀하의 생성자는 단지 인수에서 필드를 할당하고 있습니다. 왜 단지 필요한 것을 문서화하고 생성자를 전혀 가지고 있지 않는가? – JimB

+0

여기에서 몇 가지 기술을 참조하십시오 : [Optional Parameters?] (https://stackoverflow.com/questions/2032149/optional-parameters) – icza

답변

2

귀하의 유스 케이스, 도메인 및 디자인 만이 바람직한 접근 방식을 알 수 있습니다. 하지만 당신은 할 수 있습니다

1 - 사용 체인 방법 :

func main() { 
    c := new(Contact) 
    c = c.SetEmail("...").SetFirstName("...").SetLastName("...") 
} 

type Contact struct { 
    Title  string 
    FirstName string 
    LastName string 
    HomePhone string 
    WorkPhone string 
    Mobile string 
    Address *Address 
    Email  string 
} 

func (c *Contact) SetTitle(v string) *Contact  { c.Title = v; return c } 
func (c *Contact) SetFirstName(v string) *Contact { c.FirstName = v; return c } 
func (c *Contact) SetLastName(v string) *Contact { c.LastName = v; return c } 
func (c *Contact) SetHomePhone(v string) *Contact { c.HomePhone = v; return c } 
func (c *Contact) SetWorkPhone(v string) *Contact { c.WorkPhone = v; return c } 
func (c *Contact) SetMobile(v string) *Contact { c.Mobile = v; return c } 
func (c *Contact) SetAddress(v *Address) *Contact { c.Address = v; return c } 
func (c *Contact) SetEmail(v string) *Contact  { c.Email = v; return c } 

2 - 사용 기능 옵션 :

func main() { 
    c := NewContact(FirstName("..."), LastName("...")) 
    _ = c 
} 

type Contact struct { 
    Title  string 
    FirstName string 
    LastName string 
    HomePhone string 
    WorkPhone string 
    Mobile string 
    Address *Address 
    Email  string 
} 

func NewContact(options ...ContactOption) *Contact { 
    c := new(Contact) 
    for _, opt := range options { 
     opt(c) 
    } 
    return c 
} 

type ContactOption func(*Contact) 

func Title(v string) ContactOption  { return func(c *Contact) { c.Title = v } } 
func FirstName(v string) ContactOption { return func(c *Contact) { c.FirstName = v } } 
func LastName(v string) ContactOption  { return func(c *Contact) { c.LastName = v } } 
func HomePhone(v string) ContactOption { return func(c *Contact) { c.HomePhone = v } } 
func WorkPhone(v string) ContactOption { return func(c *Contact) { c.WorkPhone = v } } 
func Mobile(v string) ContactOption  { return func(c *Contact) { c.Mobile = v } } 
func SetAddress(v *Address) ContactOption { return func(c *Contact) { c.Address = v } } 
func Email(v string) ContactOption  { return func(c *Contact) { c.Email = v } } 
+1

감사합니다. Mr. Shahbazian에게 제안에 대해 감사드립니다. 나는 내가 생각하기에 이것들 중 하나를 사용할 것이고 적어도 이것은 옵션을 준다. 링크 icza 주셔서 감사합니다. – RedBloodMage

+0

opt()는 내부에 들어가는 연락처입니다. opt()가 내장되어 있지 않습니다. – RedBloodMage

+0

'opt'는'option' 안에있는 항목으로'ContactOption'의 슬라이스입니다. 'ContactOption'은'Contanct' ('* Contact')에 대한 포인터를 받아들이는 함수입니다, 그래서 모든 변경은 원래의 인스턴스에 일어날 것입니다. –