Go语言基础 | 青训营笔记

462 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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()启动子进程,获取输入输出