Skip to content

Instantly share code, notes, and snippets.

@najeira

najeira/memo.md

Last active Sep 28, 2018
Embed
What would you like to do?
Go2 generics

basicaly

contracts が不要な場合の例について。

() は可読性が低い。関数の引数の定義や、呼び出しで使われているため。記号としては、他の言語でも使われている <> を使う。記号が他の箇所と異なり、カッコ内にtypeキーワードがなくても、それがGenericsであることが分かるため、typeキーワードもなくてよい。

func Print<T>(s []T) {
	// ...
}

contracts

関数内の処理によって、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>()

error

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)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.