- Hello World
package main
import "fmt"
func main() {
fmt.Println("hello world")
}
- 编译运行
# 运行
$ go run hello.go
hello world
# 编译后运行
$ go build hello.go
$ ./hello
hello world
- 格式化代码
# 格式化代码
gofmt -w hello.go
# 格式化import
goimports -w hello.go
- 数据类型
bool 布尔 零值false
string 字符串 零值""
int 整数 零值0
float64 浮点数 零值0
- 变量赋值
//常量赋值
const Pi float32 = 3.14
//变量赋值
var text string = "hello"
//变量定义
var a,b,c int
//类型推导
var text = "hello"
//函数内短变量赋值
text := "hello"
- for循环
- 基本结构
sum := 0
for i:=0;i<10;i++ {
sum += i
}
- 简洁结构
sum := 0
for sum < 10 {
sum++
}
- 无限循环
sum := 0
for {
sum++
}
- 迭代数组切片
lists := []string{"lr", ".", "cool"}
for index,value := range lists {
fmt.Println(index, value)
}
- 迭代字典
dicts := map[string]interface{}{"name": "lr", "age": 18}
for key,value := range dicts {
fmt.Println(key, value)
}
- if-else条件判断
sum := 0
if sum == 0 {
sum++
} else {
sum--
}
- 简短语句
if sum:=0;sum == 0 {
sum++
} else {
sum--
}
- switch-case选择语句
switch sum:=0;sum {
case 0:
sum++
case 10:
sum = 0
default:
sum--
}
- 没有条件的 switch能将一长串 if-then-else 写得更加清晰
sum:=0
switch {
case sum == 0:
sum++
case sum == 10:
sum = 0
default:
sum--
}
- 函数定义
- 函数可以没有参数或接受多个参数
func add(x int, y int) int {
return x + y
}
- 当连续两个或多个函数的已命名形参类型相同时,除最后一个类型以外,其它都可以省略
func add(x, y int) int {
return x + y
}
- 函数可以返回任意数量的返回值
func swap(x, y string) (string, string) {
return y, x
}
- defer
- defer 语句会将函数推迟到外层函数返回之后执行
- 推迟的函数调用会被压入一个栈中。当外层函数返回时,被推迟的函数会按照后进先出的顺序调用。
package main
import "fmt"
func main() {
fmt.Println("counting")
for i := 0; i < 10; i++ {
defer fmt.Println(i)
}
fmt.Println("done")
}
- 指针
// 定义一个指针类型的变量,零值为nil
**var p = *int**
// 生成一个指向其操作数的指针
i := 42
**p = &i**
// 通过指针指向的底层值修改参数
*p = 24
// &取变量的指针,*根据指针取变量
- struct结构体
type Vertex struct {
X int
Y string
}
var v Vertex = Vertex{1, "2"}
var p *Vertex = &v
- 使用点号访问
v.X =2
- 通过指针访问
p.X = 3
- 结构体文法 - 隐式赋值(未列出分配零值)
var v2 = Vertex{Y:"ha"}
- [n]T数组与切片
- 类型 [n]T 表示拥有 n 个 T 类型的值的数组
var a [10]int
primes := [5]int{2, 3, 5, 7, 11}
- 类型 []T 表示一个元素类型为 T 的切片
var s []int = primes[1:4]
- 切片并不存储任何数据,更改切片的元素会修改其底层数组中对应的元素
s[0] = 555
- 切片文法会创建一个相同的数组,然后构建一个引用了它的切片,切片的零值是 nil(长度和容量为 0 且没有底层数组)
r := []bool{true, true, false}
- 切片 s 的长度和容量可通过表达式 len(s) 和 cap(s) 来获取
fmt.Println(s, len(s), cap(s))
-
make 函数会分配一个元素为零值的数组并返回一个引用了它的切片
a := make([]int, 5)
-
要指定它的容量,需向 make 传入第三个参数
b := make([]int, 0, 5)
- append 的结果是一个包含原切片所有元素加上新添加元素的切片
c := append(a, 1)
- for 循环的 range 形式可遍历切片或映射,第一个值为当前元素的下标,第二个值为该下标所对应元素的一份副本
for i, v := range c {fmt.Println(v)}