Go语言基础及实战案例
这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天,今天主要学习Go语言基础
Go语言简介
Go语言优点
- 高性能、高并发
- 语法简单、学习曲线平缓
- 丰富的标准库
- 完善的工具链
- 静态链接
- 快速编译
- 跨平台
- 垃圾回收
开发入门
安装
Golang下载链接:
https://go.dev
https://studygolang.com/
https:goproxy.cn/
开发环境
- VsCode(使用go插件)
- Goland(付费软件)
基础语法
- hello world
go程序入口是main函数
- 程序运行指令:
go run helloworld.go - 编译指令
go build helloworld.go再输入./helloworld即可运行
- 变量
go是强变量类型,每个变量都有其类型,字符串是go内置类型,可以直接通过+拼接
变量赋值几种方式:
//变量
var a = 'initial'
var b,c int=1,2
d:=float32(b)
//常量
const e string ="str"
- if else 不需要小括号,判断语句写在if后面,中间隔一个空格,大括号不能另起一行,直接写在if语句后面
- 循环 只有一种循环:for
//死循环
for{
fmt.Println("loop")
break
}
//完整for循环写法
for j:=7; j<9; j++ {
fmt.Println(j)
}
for i<=3{
i=i+1
}
- switch
- 不需要break
- switch后可以接任意类型(包括自定义结构)
- switch后可以不加变量,在大括号里的case语句进行判断,用来替换ifelse语句
- 数组(不常用
定义
var a[5] int
- 切片(常用
注意⚠️:slice中存储的有数组长度、容量和一个指向数组的指针,当前数组扩容后如果容量不够则会返回一个新的slice
s:=make([]string, 3)
s[O]="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.Printin(c)
//切片区间是左闭右开
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]
- map
键值对 使用delete语句删除元素 map中的元素是无序的,打印的时候不会按照字母顺序或存储顺序输出
- range
可以使用range对数组和map进行快速遍历
- 对于数组,range会输出两个变量:索引(可以用下划线忽略)和对应位置的值
- 对于map,返回两个值分别是key和value
- 函数
函数返回两个值:一个是真正的返回值,第二个是错误信息
package main
import "fmt"
func add(a int, b int) int {
return a + b
}
func add2(a, b int’ int {
return a + b
}
func exists(m map [string]string, k string) (v string, ok bool) {
V,ok = m[k]
return v, ok
}
func main(
{
res :=add( 1, 2)
fmt.Println(res)
v,ok := exists(map [stringlstring("a":“A"},“a")
fmt.Println(v, ok // A True
}
- 指针 go中的指针只能对参数进行一些运算操作,作用比较有限
- 结构体
- 赋值用:=
- 结构体内变量引用.
- 结构体作为参数时有指针和非指针
- 将结构体参数写在func后方法名前就可将这个方法定义为类成员方法,类对象可以用.调用该方法
- 错误处理
- 在函数返回值中定义一个error,返回的时候就可以返回错误信息,输出错误信息之前要判断一下error是否为空
- 字符串操作
func main() {
a:="hello"
fmt.Println(strings.Contains(a, “11"))// true
fmt.Printin(strings.Count(a, “1")) // 2
fmt.Println(strings.HasPrefix(a, “he"))// true
fmt.printin(strings.HasSuffix(a, “llo"))// true
fmt.Println(strings. Index(a, “11"))// 2
fmt.Println(strings.Join( []string{"he", “1lo"},-"))// he-llo
fnt.Println(stringsRepeat(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
}
格式化
- 输出用fmt.Println()
- 匹配符用%v(%+v输出变量名:值,%#v输出结构体整个构造和值
- 浮点型匹配符用%.2f表示两位小数
- JSON处理
- 成员变量名开头均为大写的结构体就可以用json中的Marshl方法进行序列化操作,
- 序列化之后的变量需要强转成string类型才能以字符串的形式输出,如果想修改成员变量名字,则可以在结构体内该变量后加个tag(‘json:“age”’)
- 反序列化:用Unmarshal
- 时间处理
- time.Now()返回一个带时区的时间变量
- time.Date()将给定值转化成日期格式
- 格式化输出使用特定时间指定格式(2006-01-02 15:04:05)
- 获取时间戳用time.Unix()
- 时间处理
- 使用strconv包中的函数进行数据格式转换
f:strconv. ParseFloat( "1.234", 64)
fmt.Println(f) //1.234
n:=strconv. ParseInt( "111",10, 64)//10代表进制
fmt.Println(n) // 111
n, _ = strconv.ParseInt( "Ox1000", 0, 64)
fmt.Println(n) // 4096
n2,:= strconv.Atoi( "123")
fmt.Println(n2) // 123
n2,err := strconv.Atoi("AAA")
fmt.Println(n2, err) // O strconv.Atoi: parsing "AAA":invalid syntax
- 进程信息
- os.Arg获取当前进程的系统信息
- os.Getenv、os.Setenv获取/设置环境变量
- exec.Command启动子进程