Packages
package main
import (
"fmt"
"math/rand"
)
Exported names
func main() {
fmt.Println(math.Pi)
}
Functions
func add(x, y int) int {
return x + y
}
// multiple results
func swap(x, y string) (string, string) {
return y, x
}
// named-return values
func split(sum int) (x, y int) {
x = sum * 4 / 9
y = sum - x
return
}
Variables
// package level var
var c, python, java bool
// func level var
func main() {
var i int
fmt.Println(i, c, python, java)
}
// var with initializer
var i, j int = 1, 2
func main() {
var c, python, java = true, false, "no!"
fmt.Println(i, j, c, python, java)
}
// short var declaration
k := 3 // invalid syntax
func main() {
c, python, java := true, false, "no!"
fmt.Println(c, python, java)
}
/* basic types
bool string int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
byte = uint8
rune = int32
float32 float64
complex64 complex128
*/
The int
, uint
, and uintptr
types are usually 32 bits wide on 32-bit systems and 64 bits wide on 64-bit systems. When you need an integer value you should use int
unless you have a specific reason to use a sized or unsigned integer type.
var i int = 42
var f float64 = float64(i) // require explicit conversion
// type inference
var i = "42"
fmt.Printf("i is of type %T\n", i)
// const
const Pi = 3.14
const World = "世界" // const cannot be declared using the := syntax
const (
Big = 1 << 100
Small = Big >> 99 // An untyped constant takes the type needed by its context.
)
For
// go for loop requires braces {} but no parentheses
func main() {
sum := 0
for i := 0; i < 10; i++ {
sum += i
}
fmt.Println(sum)
}
// while loop
func main() {
sum := 1
for sum < 1000 {
sum += sum
}
fmt.Println(sum)
}