这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
Go语言基础 |青训营笔记
Golang特点
- 高并发、高性能:性能接近c++, java
- 可靠丰富的标准库:稳定性和兼容性高
- 静态编译:所有编译结果默认静态链接,不需要付家人和东西就能运行
- 编译快:耗时短
- 跨平台:甚至能在路由器上运行
- 带垃圾回收的语言
Golang语言云计算、微服务有很广泛的应用
基本语法
Example1: hello world
package main//main包是程序入口包
import (//圆括号而不是花括号
"fmt"
)
func main() {
fmt.Println("hello world")
}
- go run xxx.go
- go build xxx.go 编译成二进制
Example2: 基本类型 大同小异
package main
import "fmt"
func main() {
/****变量声明方式******
// var 变量名 (类型)= 值
// 变量名 := 值
// 常量:var 改成 const 即可
*********************/
var a = "a1" //字符串是内置类型
g := a + "g2" //字符串可通过加号拼接
var e float64
f := float32(e)
fmt.Println(a, e, f, g)
}
if/ else/ else if/ for/ switch
条件不需要加括号
for{
xxx
}//表示一个死循环
switch与c++不同,跑到一个分支不需要写break就会跳出
数组
长度固定
//几种初始化方法
var a [5]int
b := [5]int{1,2,3,4,5}
var twod [2][3]int
切片
切片实际存储的是一个长度,一个容量和一个指向数组的指针。相对于数组而言的优势是长度可变。
s :=make([]string,3)//创建切片
s = append(s,"d")//需赋值回去
c := make([]string,len(s))
copy(c,s)//拷贝元素
fmt.Pringln(s[2:3])//不包含右区间,不可用负数索引
good := []string{"g","o","o","d"}
map
m := make(map[string]int)//无序键值对,类似python的Defaultdict
m["one"] = 1//写
r, ok := m["unknown"]//r = 0, ok = flase
delete(m,"one")//删
range
nums := []int{1,2,3,4}
for idx,num := range nums{//不需要下标可用_赋位i
***内容***
}
m := map[string]string{"a":"A","b":"B"}
for k, v := range m{
***内容***
}
函数
- 变量类型后置
- 支持返回多个值,业务中经常返回多个值,如第一值为需要返回的值,第二个值为返回的错误信息
func exists(m map[string]int, k string)(v int, ok bool){
v, ok = m[k]
return v, ok
}
指针
package main
import "fmt"
func add2ptr(n *int){
*n += 2
}
func main(){
n := 5
add2ptr(&n)//类比c
fmt.Println(n)// 7
}
结构体
package main
import "fmt"
type user struct{
name string
score int
}
func(u *user) reset(num int){//结构体方法,类似成员函数
u.score = num
}
func main(){
a := user{name:"xzl", score : 100}
a.score = 120
var b user
b.reset(200)
fmt.Println(a,b)
}
错误处理
需要import "error"
func findUser(u []user,name string)(v *u,err error){
for _,u := range user{
if u.name == name{
return &u, nil
}
}
return nil, errors.New("not found")//注意大小写
}
func main(){
******
r, err = findUser([]user{"xzl",100}, "lsy")
if err != nil{
fmt.Println(err)
return
}
}
字符串格式化
fmt.Printf("x = %v\n",x)用%v指代任意类型,
%+v和%#v可以进一步详细展示变量。
关于浮点数保留几位小数,如2位,类似java用%.2f
JSON处理
只要结构体公开字段的每一个字段第一个字母是大写,就能用json.Marshal()序列化,序列化需要加string()强制类型转换输出。如果想小写输出字段,需要加json:"xxx"标记。
type user struct{
Name string
Age int `json:"age"`
}
func main(){
a := user{Name:"xzl",Age:10}
buf, err := json.Marshal(a)
if err != nil{
panic(err)
}
fmt.Println(string(buf))
}
时间处理
now := time.Now()最常用的现在时间
t := time.Date(2023,1,15,15,30,0,time.UTC)构造时间
diff := t.Sub(now)时间减法
diff.Minutes()该时段分钟数
diff.Seconds()该时段秒数
t.Format("2006-01-02 15:04:05")格式化时间到时间字符串,这个时间写在官方文档里的,特定字符串
time.Parse("2006-01-02 15:04:05")格式化字符串到时间
now.Unix()获取时间戳
字符串与数字转换
num, _ := trconv.ParseInt("111",进制(0为自动推测),精度(64))字符串转整数
num, _ := strconv.Atoi("111")十进制转换
获取进程信息
os.Args获取进城执行时的命令行参数
os.Getenv("PATH")获取环境变量
os.Getenv()写入环境变量
buf,err:=exec.Command("grep","127.0.0.1","/etc/hosts").CombinedOutput()启动子进程,获取输入输出