contracts が不要な場合の例について。
()
は可読性が低い。関数の引数の定義や、呼び出しで使われているため。記号としては、他の言語でも使われている <>
を使う。記号が他の箇所と異なり、カッコ内にtype
キーワードがなくても、それがGenericsであることが分かるため、type
キーワードもなくてよい。
func Print<T>(s []T) {
// ...
}
関数内の処理によって、Tに要求されるものがかわる場合はinterfaceを使う。
type Stringer interface {
String() string
}
func Stringify<T Stringer>(s []T) (ret []string) {
for _, v := range s {
ret = append(ret, v.String())
}
return ret
}
type Foo struct {}
func (f *Foo) String() string {
return "foo"
}
Stringify<Foo>()
func CopyFile(src, dst string) error {
r := check os.Open(src)
defer r.Close()
w := check os.Create(dst)
check io.Copy(w, r)
check w.Close()
return nil
} recover(err error) {
if w != nil {
w.Close()
os.Remove(dst)
}
return fmt.Errorf("copy %s %s: %v", src, dst, err)
}