Go のサンプルいくつか
Methods:
package main import "log"; type string_list struct { items []string; } func (self *string_list) Join(sep string)(string) { retval := ""; for i := 0; i < len(self.items); i++ { if i > 0 { retval += sep; } retval += self.items[i]; } return retval; } func main() { log.Stdout((string_list{ items: []string { "え", "っ", "ち" } }).Join("-")); }
Interfaces:
package main import ( "log"; "strconv"; ) type string_list struct { nitems int; items []string; } type int_list struct { nitems int; items []int; } type list interface { len()(int); get(int)(string); add(string); } func min(a int, b int)(int) { if a < b { return a; } return b; } func (self *string_list) len()(int) { return self.nitems; } func (self *int_list) len()(int) { return self.nitems; } func (self *string_list) get(n int)(string) { return self.items[n]; } func (self *int_list) get(n int)(string) { return strconv.Itoa(self.items[n]); } func (self *string_list) resize(n int) { new_items := make([]string, n); nitems := len(self.items); c := min(nitems, n); for i := 0; i < c; i++ { new_items[i] = self.items[i] } self.items = new_items; } func (self *int_list) resize(n int) { new_items := make([]int, n); nitems := len(self.items); c := min(nitems, n); for i := 0; i < c; i++ { new_items[i] = self.items[i] } self.items = new_items; } func (self *string_list) add(item string) { if self.nitems >= len(self.items) { if self.nitems == 0 { self.resize(16) } else { self.resize(self.nitems * 2) } } self.items[self.nitems] = item; self.nitems += 1; } func (self *int_list) add(item int) { if self.nitems >= len(self.items) { if self.nitems == 0 { self.resize(16) } else { self.resize(self.nitems * 2) } } self.items[self.nitems] = item; self.nitems += 1; } func foreach(items list, fun func(string)) { for i := 0; i < items.len(); i++ { fun(items.get(i)); } } func main() { slist := new(string_list); log.Stdout("len=", slist.len()); slist.add("test"); log.Stdout("len=", slist.len()); foreach(slist, func(__ string) { log.Stdout(__); } ); ilist := new(int_list); log.Stdout("len=", ilist.len()); ilist.add("test"); log.Stdout("len=", ilist.len()); // int_list は add(item string) を実装していないので、 // 次の行でエラーになる foreach(ilist, func(__ string) { log.Stdout(__); } ); }
ちょいと試すなら fmt.Printf() より log.Stdout() の方がおてがるですね。