package main type S1 struct {i int; j int} func (s *S1) Inc() int { t := s.i s.i += 66 assert(s.i - t == 66) return s.i } func (s S1) Inc2() int { assert(s.j == 0) s.j += 1 assert(s.j == 1) return s.j } func typeAssert() { var i interface{} = "hello" s, ok := i.(string) assert(ok) assert(s == "hello") s1 := i.(string) assert(s1 == "hello") var j interface{} = "h" s, ok = j.(string) assert(ok) assert(s == "h") } type Add func(a int, b int) int func main() { type S2 struct {i int} var s1 S1 //var s2 S2 s1.Inc() s1.Inc2() assert(s1.i == 66) assert(s1.j == 0) p := &s1.i *p = 5 assert(s1.i == 5) assert(s1.i == *p) f := s1.Inc f() assert(s1.i == 71) var afunc Add = func(i int, j int) int { return i + j + 1} d := afunc(s1.i, s1.j) assert(d == s1.i + s1.j + 1) typeAssert() } // 3, 8, 9