这是我参与「第五届青训营 」笔记创作活动的第1天
2.1 go基础语法 helloworld
程序入口包 入口文件
package main
导入标准库format包 输入输出 格式化字符串
import{
"fmt"
}
main函数中调用~输出 hello world
func main(){
fmt.Println("hello world")
}
运行
go run helloworld.go
编译成二进制
go build helloworld.go
编译完后使用./hellowold运行
将鼠标悬浮在fmt函数上1s能看到函数文档
链接整个包的在线文档
01-hello
package main
import (
"fmt"
)
func main() {
fmt.Println("hello world")
}
2.2 变量
变量类型
字符串、整型、布尔型浮点型
go语言字符串内置,可直接通过“+”号拼接
运算优先级于C类似
变量声明
第一种
var name (type)= value
可自动推导变量类型 也可显式说明
第二种
name := value
常量 可根据上下文自动确定类型
把var改为const
package main
import (
"fmt"
"math"
)
func main() {
var a = "initial"
var b, c int = 1, 2
var d = true
var e float64
f := float32(e)
g := a + "foo"
fmt.Println(a, b, c, d, e, f) // initial 1 2 true 0 0
fmt.Println(g) // initialapple
const s string = "constant"
const h = 500000000
const i = 3e20 / h
fmt.Println(s, h, i, math.Sin(h), math.Sin(i))
}
2.3 if else
和c类似 没有小括号
条件后跟大括号 不能像c写在同一行
2.4 循环
没有(do) while循环 只有for循环
三段条件可省略任意一段
可用continue继续循环
break跳出循环
可以使用 for {} 来做死循环;
2.5 switch
变量名不需要括号
和c不同 不用加break
执行完一个条件后即跳转到末尾
可使用任意类型
2.6 数组
具有编号,长度固定的元素序列
var name [number]type
06-array
package main
import "fmt"
func main() {
var a [5]int
a[4] = 100
fmt.Println("get:", a[2])
fmt.Println("len:", len(a))
b := [5]int{1, 2, 3, 4, 5}
fmt.Println(b)
var twoD [2][3]int
for i := 0; i < 2; i++ {
for j := 0; j < 3; j++ {
twoD[i][j] = i + j
}
}
fmt.Println("2d: ", twoD)
}
2.7切片
更常用 任意时刻可更改长度的数组
s :=make([]string,3)
可用append追加元素
s = append(s, "d")
用make创建slyce也可直接赋予长度
用copy在两个slyce间拷贝数据
可像python做切片操作
07-slice
package main
import "fmt"
func main() {
s := make([]string, 3)
s[0] = "a"
s[1] = "b"
s[2] = "c"
fmt.Println("get:", s[2]) // c
fmt.Println("len:", len(s)) // 3
s = append(s, "d")
s = append(s, "e", "f")
fmt.Println(s) // [a b c d e f]
c := make([]string, len(s))
copy(c, s)
fmt.Println(c) // [a b c d e f]
fmt.Println(s[2:5]) // [c d e]
fmt.Println(s[:5]) // [a b c d e]
fmt.Println(s[2:]) // [c d e f]
good := []string{"g", "o", "o", "d"}
fmt.Println(good) // [g o o d]
}
2.8map
哈希/字典
key的类型value的类型
方括号语法写入/读取K-V对
delete删除K-V对
读取时加ok来判断K-V对是否存在
随机顺序输出
2.9 range
range来快速遍历
对于数组返回两个值 索引 值
可用下划线忽略索引
map返回key value
2.10 函数
变量类型后置
返回第一个结果 第二个错误信息
2.11 指针
主要对传入参数进行修改
函数参数为指针时
调用时加&符号才能编译通过
2.12 结构体
带类型字段的结合
.字段名字来读取写入结构体内容
也能作为函数参数 也可传指针形式
2.13 结构体方法
类似 类成员函数
也可带指针 就能对结构体进行修改
2.14 错误处理
使用单独返回值传递错误信息
正确返回原本值,nil
错误返回nil,errors.New("NOT FOUND")
调用完判断err是否存在
进行处理打印阈值 跳出 返回函数
只有没有err才能真正取返回值 否则出现空指0错误
2.15 字符串操作
strings包中的字符串工具函数 len(b)一个中文可能对应多个字符
15-string
package main
import (
"fmt"
"strings"
)
func main() {
a := "hello"
fmt.Println(strings.Contains(a, "ll")) // true
fmt.Println(strings.Count(a, "l")) // 2
fmt.Println(strings.HasPrefix(a, "he")) // true
fmt.Println(strings.HasSuffix(a, "llo")) // true
fmt.Println(strings.Index(a, "ll")) // 2
fmt.Println(strings.Join([]string{"he", "llo"}, "-")) // he-llo
fmt.Println(strings.Repeat(a, 2)) // hellohello
fmt.Println(strings.Replace(a, "e", "E", -1)) // hEllo
fmt.Println(strings.Split("a-b-c", "-")) // [a b c]
fmt.Println(strings.ToLower(a)) // hello
fmt.Println(strings.ToUpper(a)) // HELLO
fmt.Println(len(a)) // 5
b := "你好"
fmt.Println(len(b)) // 6
}
2.16 字符串格式化
fmt.Println(s, n)打印多个变量并换行
fmt.Printf( "s=%v\n", s )
%v任意类型变量 值
%d数字 %s字符串
%+v得更详细的结果 字段名 值
%#v进一步详细 构造类型名称 字段名 值
%.2f保留两位小数浮点数
2.17 JSON处理
公开字段首字母大写
json.Marshal(a)序列化成buf数组 可理解为字符串
直接打印为16进制数 需要强制类型转换
json.unmarshal反序列化到空变量里
序列化后大写字母开头 在字段结构体后加json的tag修改成小写
2.18 时间处理
time.Now()最常用 快速获取当前时间
time.Date()构造带时区的时间
.Sub作减法得到时间段
.Format格式化到时间字符串
.Parse时间字符串解析成时间
time.Unix和某些系统交互时获取时间戳
2.19 数字解析
strconv包
.ParseInt(字符串, 进制, 精度) .ParseFloat解析字符串
.Atoi快速将十进制字符串转为数字
.Rtoa数字转字符串
输入不合法返回错误
2.20 进程信息
os.Args进程执行时命令行参数
路径+名字 参数
os.Getenv os.Setenv获取写入环境变量
exec.Commond快速启动子进程并获取其输入输出