More Related Content
Similar to インタフェースの実装パターン
Similar to インタフェースの実装パターン (20)
More from Takuya Ueda (20)
インタフェースの実装パターン
- 7. typeを型の宣言の文法
TypeDecl = "type" ( TypeSpec | "(" { TypeSpec
";" } ")" ) .
TypeSpec = identifier Type .
Type = TypeName | TypeLit | "(" Type ")" .
TypeName = identifier | QualifiedIdent .
TypeLit = ArrayType | StructType | PointerType
| FunctionType | InterfaceType
| SliceType | MapType | ChannelType .
- 10. 型リテラル
● 配列型 :[10]int
● 構造体型 :
struct { /* フィールドリスト */ }
● ポインタ型:*int
● 関数型 :function(s string) int
● インタフェース型:
interface { /* メソッドリスト */}
● スライス型:[]int
● マップ型 :map[string]int
● チャネル型:chan bool
- 13. メソッドの定義方法
// pはレシーバ
func (p *Person) String() string {
return fmt.Sprintf(
"%s %s (%d)",
p.FirstName,
p.LastName,
p.Age,
)
}
type Person struct {
FirstName string
LastName string
Age int
}
- 28. 埋め込みの例
type Name struct {
FirstName string
LastName string
}
func (n *Name) String() string {
return fmt.Sprintf("%s %s")
}
type Person struct {
*Name // *Name型の値を埋め込む
Age int
}
- 29. 埋め込みの例
n := &Name{
FirstName: "Taro",
LastName: "Yamada",
}
p := &Person{
Name: n, // *Name型のnを埋め込む
Age: 20,
}
// nのメソッドをpのメソッドのように呼べる
fmt.Println(p.String())
- 33. 一部のメソッドだけ実装させる
type person struct {
firstName string
lastName string
}
// Nameメソッドだけだと
// Personインタフェースは実装したことにならない
func (p *person) Name() string {
return fmt.Sprintf(
"%s %s", p.firstName, p.lastName
)
}
type Person interface {
Title() string
Name() string
}
- 34. 残りは埋め込み先で実装させる
type female struct {
*person
}
func (f *female) Title() string {
return "Ms."
}
type male struct {
*person
}
func (m *male) Title() string {
return "Mr."
}
- 38. インタフェース型の埋め込み
func main() {
p := Person{
Stringer: nil,
FirstName: "Taro",
LastName: "Yamada",
Age: 20,
}
fmt.Println(p.Stringer) // nil
p.Stringer = ???
}
type Person struct {
fmt.Stringer
FirstName string
LastName string
Age int
}
fmt.Stringerインタフェースを実装していれば代入できる
- 40. 埋め込む構造体をバインドする
func BindStringer(
p *Person,
f func(p *Person) string) fmt.Stringer,
{
return StringerFunc(func() string {
return f(p)
})
} type StringerFunc func() string
func (sf StringerFunc) String() string {
return sf()
}