4.4.3 인터페이스 임베딩
구조체가 다른 사용자 정의 타입을 임베딩할 수 있었던 것과 마찬가지로 인터페이스도 다른 인터페이스를 임베딩할 수 있다. 이는 임베디드된 인터페이스의 메서드 서명을 직접 갖고 있는 것과 같은 효과를 준다.
다음 코드는 앞에서 봤던 Coster와 fmt.Stringer 인터페이스를 임베디드 인터페이스로 지정하여 Itemer를 정의한다.
type Itemer interface { Coster fmt.Stringer }
Itemer 인터페이스로 사용하려면 Coster 인터페이스에 정의된 Cost() 메서드와 fmt.Stringer 인터페이스에 정의된 String() 메서드를 모두 갖고 있어야 한다.
Itemer를 임베디드 필드로 가진 Order 구조체를 정의해 보자. Order의 Cost() 메서드에서는 tax를 적용한 최종 가격을 계산하고, String() 메서드에서는 전체 정보를 담는 문자열을 만든다.
type Order struct { Itemer taxRate float64 } func (o Order) Cost() float64 { return o.Itemer.Cost() * (1.0 + o.taxRate/100) } func (o Order) String() string { return fmt.Sprintf(“Total price: %.0f(tax rate: %.2f)\n\tOrder details: %s”, o.Cost(), o.taxRate, o.Itemer.String()) }