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 |