Golang 记录
环境信息查看 go env
运行文件 go run file.go
构建二进制文件 go build file.go
连接符 +
声明变量
var str string = "abc"
var str = "abc"
a := 1
b := 2
a, b = b, a
定义常量 const str string = "abc"
配合常量使用 iota 默认为0;
const (
a = iota
b = iota
c = iota
)
输出 0 1 2
接收外部参数 os.Args[1]
单元测试 go test -v --run functionName xx_test.go testfile.go ....go
-v 打印详细输出日志
--run 指定要测试的方法名(如果不输入这个 则执行所有的测试方法)
xx_test.go 测试代码所在的文件
testfile.go 依赖的被测试的文件 (要加上否则找不到被测试的方法)
if 语句
if a := 1 == 1; a {
t.Log("1==1", a)
}
for 循环, switch
for i := 0; i < 5; i++ {
switch i {
case 0, 2:
t.Log("Even")
case 1, 3:
t.Log("Odd")
default:
t.Log("it is not 0-3")
}
switch {
case i%2 == 0:
t.Log("Even")
case i%2 == 1:
t.Log("Odd")
default:
t.Log("unknow")
}
}
... 自动设置数组元素个数
arr3 := [...]int{1, 3, 4, 5}
for i := 0; i < len(arr3); i++ {
t.Log(arr3[i])
}
foreach
for idx, e := range arr3{
t.Log(idx, e)
}
_ 占位
for _, e := range arr3{
t.Log(e)
}
array
// [开始截取的下标:截取到第几个元素] [2:3] 从下标2开始,截取到第三个元素
// 数组容量不可变
arr3 := [...]int{1, 2, 3, 4, 5}
arr3Sec := arr3[2:3] // 从下标2开始,截取到第三个元素
t.Log(arr3Sec) // [3]
arr3Sec := arr3[2:] // 从下标2位开始,截取到最后
t.Log(arr3Sec) // [3 4 5]
arr3 := [...]int{1, 2, 3, 4, 5}
arr3Sec := arr3[:2] // 截取到第2个元素
t.Log(arr3Sec) // [1 2]
切片 (动态数组)
* 注意 切片共用同一块储存空间,一旦某个元素修改了,则整个储存数据都将改变
// 数组可以进行比较 切片不可以
初始化 s :=[] int {1,2,3 }
初始化空切片 var s0 []type
使用make创建 s := make([]type, len, capacity)
len() 获取现有长度, cap() 获取最大容量
var s0 []int
t.Log(len(s0), cap(s0)) // 0 0
s0 = append(s0, 1)
t.Log(len(s0), cap(s0)) // 1 1
map
m1 := map[int]int{1:1, 2:4, 3:9}
t.Log(m1[2])
t.Logf("len m1=%d", len(m1))
m2 := map[int]int{}
m2[4] = 16
t.Logf("len m2=%d", len(m2))
m3 := make(map[int]int, 10)
t.Logf("len m2=%d", len(m3))
// 函数式设置
m := map[int]func(op int) int{}
m[1] = func(op int) int {return op}
m[2] = func(op int) int {return op * op}
m[3] = func(op int) int {return op * op * op}
t.Log(m[1](2), m[2](2), m[3](2))
mySet := map[int]bool{}
mySet[1] = true
mySet[3] = true
t.Log(len(mySet)) // 2
delete(mySet, 1) // 使用delete 删除元素
t.Log(len(mySet)) // 1
string
s := "A,B,C"
parts := strings.Split(s, ",") // 字符串拆分 [A B C]
t.Log(strings.Join(parts, "-")) // 组合为字符串 A-B-C
s := strconv.Itoa(10) // 整数转为字符串
t.Log("str" + s) // str10
if i, err := strconv.Atoi("10"); err == nil { // 字符串转为整数 会返回值和错误信息
t.Log(10 + i, i, err) // 20 10 <nil>
}
defer // 函数结束时执行
func Clear() {
fmt.Println("Clear resource.")
}
func TestDefer(t *testing.T) {
defer Clear()
fmt.Println("Start")
panic("error")
}
package
在main被执行前,所以init方法会先执行,可以每个包里可以有多个init