【1】Go基础语法1 | 青训营笔记

90 阅读2分钟

这是我参与「第五届青训营」笔记创作活动的第1天。

【1】Hello World

package main

main包,程序的入口包。

import (
	"fmt"
)

标准库的fmt包,format,输入输出格式化字符串。

文档 pkg.go.dev/fmt

func main() {
	fmt.Println("hello world")
}

main函数,fmt.Println函数输出。

运行:

go run main.go

编译成二进制:

go build

./main

【2】变量

强类型语言。

var a = "initial"
var b, c int = 1, 2
var d = true
var e float64

变量声明1,var 变量名 类型=值,类型可省略,自动推导。

f := float32(e)

变量声明2,变量名:=值。

g := a + "foo"
fmt.Println(a, b, c, d, e, f) 	// initial 1 2 true 0 0
fmt.Println(g)			// initialfoo

字符串,加号+拼接,等于号==比较。

const s string = "constant"
const h = 500000000
const i = 3e20 / h
fmt.Println(s, h, i, math.Sin(h), math.Sin(i))

常量,没有确定的类型,根据上下文确定。

【3】if else

if num := 9; num < 0 {
	fmt.Println(num, "is negative")
} else if num < 10 {
	fmt.Println(num, "has 1 digit")
} else {
	fmt.Println(num, "has multiple digits")
}

条件没有小括号,大括号不可省略。

【4】循环

只有for循环。

for {
	fmt.Println("loop")
	break
}

死循环,可用break跳出循环,continue继续循环。

for j := 7; j < 9; j++ {
	fmt.Println(j)
}

三段,都可省略。

for i <= 3 {
	fmt.Println(i)
	i = i + 1
}

循环条件。

【5】switch

switch a {
case 1:
	fmt.Println("one")
case 4, 5:
	fmt.Println("four or five")
default:
	fmt.Println("other")
}

变量名没有小括号,每个case不需要break。

t := time.Now()
switch {
case t.Hour() < 12:
	fmt.Println("It's before noon")
default:
	fmt.Println("It's after noon")
}

可代替 if else,switch后不写变量,case后写条件。

【6】数组

var a [5]int
fmt.Println("len:", len(a))
fmt.Println(a)

定义一维数组,获取数组长度,打印数组。

var twoD [2][3]int
fmt.Println("2d: ", twoD)

定义二维数组,打印数组。

数组长度固定,一般用切片。

【7】切片

切片,slice。

s := make([]string, 3)

make创建切片,s[0]取值,len(s)获取长度。

s = append(s, "e", "f")
fmt.Println(s)

append追加元素,赋值给原数组。

原理,存储长度、容量、指向数组的指针,容量不够会扩容。

c := make([]string, len(s))
copy(c, s)
fmt.Println(s[2:5])
fmt.Println(s[:5])
fmt.Println(s[2:])

创建时可指定长度,copy复制。

切片,区间左闭右开,不支持负数索引。

good := []string{"g", "o", "o", "d"}
fmt.Println(good)			// [g o o d]

【8】map

m := make(map[string]int)
fmt.Println(m)			// map[one:1 two:2]

make创建,键key的类型和值value的类型,m["one"]=1存取键值对,len(m)获取长度。

r, ok := m["unknow"]
fmt.Println(r, ok)	// 0 false
delete(m, "one")

取值时要检查是否存在,delete删除键值对。

m2 := map[string]int{"one": 1, "two": 2}
var m3 = map[string]int{"one": 1, "two": 2}

map完全无序。

【9】range

遍历slice或map。

nums := []int{2, 3, 4}
for i, num := range nums {
    //..
}

遍历数组,i是索引,num是值,不需要索引可用下划线忽略。

m := map[string]string{"a": "A", "b": "B"}
for k, v := range m {
    //..
}
for k := range m {
    //..
}

遍历map,k是键,v是值。