====== GO ====== ===== Variables ===== // Outside a function, every statement begins with a keyword (var, func, and so on) and so the := construct is not available. var a int var a, b int var i,j int = 1, 2 var x int = 3 // Inside a function, the := short assignment statement can be used in place of a var declaration with implicit type. y := 3 ====== Types ====== ===== Types conversion ===== The expression **T(v)** converts the value **v** to the type **T**. Unlike in C, in Go assignment between items of different type requires an explicit conversion. i := 42 f := float64(i) u := uint(f) ===== Type assertions ===== t := i.(T) This statement asserts that the interface value **i** holds the concrete type **T** and assigns the underlying **T** value to the variable t. If **i** does not hold a **T**, the statement will trigger a panic. To test whether an interface value holds a specific type, a type assertion can return two values: the underlying value and a boolean value that reports whether the assertion succeeded. t, ok := i.(T) if t, ok := i.(T); ok { ... } ====== method names ====== * Method names written from upper-case letter are exported form module * to write internal methods (like static function in c) start function name from lower case ====== closures ====== func main() { add := func(x, y int) int { return x + y } fmt.Println(add(1,1)) } func makeEvenGenerator() func() uint { i := uint(0) return func() (ret uint) { ret = i i += 2 return } } ====== Concatenate slices ====== moreBytes := []byte{1,2,3,4} bytes := []byte{2} bytes = append(bytes, 4) bytes = append(bytes, moreBytes...)