読者です 読者をやめる 読者になる 読者になる

DRYな備忘録

Don't Repeat Yourself.

Go言語でジェネリクスっぽいことしたいでござるの続き【golang】【generics】

前のやつ

の続きっていうかメモ

/*****
 * Go言語で型変数を受けるCollectionみたいなの
 *****/

package main

import "fmt"
import "reflect"

type E struct {
    element interface{}
    score int
}
func (e *E) Elem() interface{} {
    return e.element
}

type Collection struct {
    representative interface{}
    elements []E
}
func (c *Collection) Push(v interface{}) (e error) {
    if reflect.TypeOf(c.representative) != reflect.TypeOf(v) {
        return fmt.Errorf("%sはこのコレクションの型変数に一致しません", reflect.TypeOf(v).String()) 
    }
    c.elements = append(c.elements, E{element:v})
    return
}
func (c *Collection) Count() int {
    return len(c.elements)
}
func (c *Collection) Find(index int) (el E, err error) {
    if index < c.Count() {
        el = c.elements[index]
        return
    }
    err = fmt.Errorf("%d番目の要素は見つかりません", index)
    return
}
func NewCollectionOf(v interface{}) *Collection {
    return &Collection{
        representative: v,
    }
}

type Person struct {
    Name string
}
func (p *Person) Greet() {
    fmt.Printf("Hi, I'm %s.", p.Name)
}

func main() {
    collection := NewCollectionOf(&Person{})
 
    collection.Push(&Person{"田井中律"})
    collection.Push(&Person{"秋山澪"})
 
    fmt.Println(collection.Push("平沢唯"))
 
    fmt.Println(collection.Count())
 
    mio, e := collection.Find(3)
    fmt.Println(mio, e)
    mio, e = collection.Find(1)
    fmt.Println(mio, e)
 
    mio.Elem().(*Person).Greet()
}

じっこうけっか

stringはこのコレクションの型変数に一致しません
2
{<nil> 0} 3番目の要素は見つかりません
{0x10500178 0} <nil>
Hi, I'm 秋山澪.

はい。DRYな備忘録

f:id:otiai10:20140618135125j:plain