Golang에는 상속이라는 개념이 없습니다.

하지만 구조체에서 임베딩을 사용하여 Is-a관계로 만들 수 있습니다.

// delegation
// 상속이 아니기 때문에 Person을 원하는 function에 Developer를 전달 할 수는 없다.

type Person struct {
	name string
    age int
}

func (p *Person) walk(){
	fmt.Println("walk...")
}

type Developer struct {
	Person
	uselanguage string
}



func main(){
	d := Developer{}
    d.Person.walk() //walk...
    d.walk() //walk...
}

위 코드에서와 같이, 마치 상속과 같은 구현이 가능해지는 것입니다.

 

type Fields struct {
	VisibleField   string
	InvisibleField string
}

////두개의 구조체가 가진 필드가 같을떄는 둘 다 안 나옴
////같은것만 안나옴.
// type Blocks struct {
// 	VisibleField   string
// 	InvisibleField string
// }

// 만약 아래 구조체에 위 Fields 구조체를 임베딩 했을 경우
// 중복되는 값에 대해서는 MyFields의 필드를 우선시 하며(구조 자체를)
// Wow와 같은 값은 당연히 표현 됨.
type MyFields struct {
	*Fields
	InvisibleField string
	Wow            string
}

func ExamplePrac() {
	f := &Fields{"a", "b"}

	m := &MyFields{f, "c", "wow"}
	b, _ := json.Marshal(m)
	// b2, _ := json.Marshal(f)
	fmt.Println(string(b))
	// fmt.Println(string(b2))

	//Output:
    //{"VisibleField":"a","InvisibleField":"c","Wow":"wow"}
}


 

응용

type Fields struct {
	VisibleField   string `json:"visibleField"`
	InvisibleField string `json:"invisibleField"`
}

func ExampleOmitFields() {
	f := &Fields{"a", "b"}
	b, _ := json.Marshal(struct {
		*Fields
        //,omitempty를 이용해 값을 파싱되지 않게 할 수 있음
		InvisibleField string `json:"invisibleField,omitempty"`
		AdditionField  string `json:"additionField"`
	}{Fields: f, AdditionField: "c"})
	fmt.Println(string(b))
	//Output:
}

 

'language, framework, library > golang' 카테고리의 다른 글

[Golang] json의 null  (0) 2019.06.17
[Golang] coverage  (0) 2019.06.12
[Golang] Instance  (0) 2019.06.11
[Golang] pointer  (0) 2019.06.10
[Golang] basics  (0) 2019.06.10

+ Recent posts