1 目标
- 主要是自己看的这个笔记,便于后续再进行复习
- 语法栏目,当然搞清楚语法
2 GO语法
前提
- 环境配置
- vscode 有个go插件
- 需要按ctrl+shift+p 调出命令面板
- 输入go install tools 选Go: Install/Update Tools
- golang最好,功能全,学生学习比较好
- 说明
- GOPATH: Go项目的位置,用GO MOD来管理项目
- GOROOT: 这个就是我们的go的安装路径
- vscode 有个go插件
- goproxy 配置(代理配置)
set GO111MODULE=on
set GOPROXY=https://goproxy.cn
介绍
- 高并发,高性能
- 标准库丰富(感觉相对c++来说)
- 静态链接
- 快速编译且跨平台
- 垃圾回收(重要)
- 对比JAVA,内置库简易很多
第一行代码
- package main包
- import()需要的包,fmt常用,记得带双引号
- fmt 格式化输入输出相关函数
- 命令行
- go build 相对地址/绝对地址:编译成二进制,变成一个exe文件
- go run path:直接运行
注意,别写小括号和分号
变量
- 可以自动推断(方式:=/名称前var)
- 浮点32/64、整数、常量、字符串、
常量
- const字段与var字段的区别
语句
-
条件判断
- ifelse,不带括号,估计是编译器的区别
- println()内部很自由
- 如 println(num,"is postive")
-
循环
- 只有for循环
- 在go中没有while和do while
-
选择语句
- switch 不用括号,且自带break
- 其他跟c++一样
数组和切片
- 数组
- 定义:一个具有编号且长度固定的元素序列。
- 用的不多,更多是可变长度的切片
- len() 取长度
- var a [5]int、b:=[5]int{1,2,3,4,5}
- 切片
- 切片不同于数组,它可以任意的更改长度,同时也具有更多丰富的操作
- make创建切片
- s:=make([]string,3)
- append新增切片
- 需要一个切片接收,如果不够会扩容,返回一个新切片
- good =append(goood,"!")
- 注意
slice 拥有像 python 一样的切片操作(左开右闭),例如 [2:5] 这个代表去除第二个到第五个位置的元素,不包括第五个元素 不同于python,这里不支持负数索引。
map 和 range
- 哈希、字典等名称
-
通过make创建
-
m:=make(map[string]int) 这样的kv
-
r,ok:=m["unknow"]
- ok判断看是否存在
- r返回0(找不到默认0),ok返回false
-
delete删除kv对
-
默认初始化(在上面make例子后面加大括号{“one”:1……})
-
注意 map 无序
- range
- 对于一个 slice 或 map ,我们可以通过 range 来快速遍历
- 遍历
- 对于数组会返回两个值(第一个是k,第二个是v)
- 如果我们不需要索引的话,可以使用下划线来忽略。
函数
- 变量类型是后置的
- 支持返回多个值,很强,逗号隔开
- 与结构体不同,结构体有个结构体本身的对象(这个不用默认入参)
指针
- 相比 C 和 C++ 里面的指针,支持的操作很有限。
- 基于&和*,主要能够修改实参
结构体与其方法
- 定义(没有分号)
type user struct {
name string
password string
}
- 直接确定
- a := user{name: "wang", password: "1024"} //初始化
- b := user{"wang", "1024"} //使用默认的顺序
- c := user{name: "wang"} //缺省
- 难点
- 结构体定义方法,类似类成员函数
- 如checkPassword 的实现,从一个普通函数改成了结构体的方法,这样用户可以使用 a.checkPassword() 这样调用
- 具体的代码修改:把第一个参数加上括号,写到函数名称前面。
package main
import "fmt"
type user struct {
name string
password string
}
func (u user) checkPassword(password string) bool {
return u.password == password
}
func (u *user) resetPassword(password string) {
u.password = password
}
func main() {
a := user{name: "wang", password: "1024"}
a.resetPassword("2048")
fmt.Println(a.checkPassword("2048")) // true
}
错误处理
- 类型就是error类型,需要error.New(错误信息(自己加))
- 我们可以在函数的返回值类型里面,增加一个error,代表这个函数可能返回错误
- 在函数实现的时候,return需要同时return两个值。
- 如果出现错误的话,就可以return nil 和一个 error 。
- 如果没有错误的话,那么就返回原本的结果和 nil。
nil 等于null
字符串
在标准库 strings 包里面有很多常用的字符串工具函数
- contains 判断一个字符串里面是否有包含另一个字符串
- count 字符串计数
- index 查找某个字符串的位置
- join 连接多个字符串
- repeat 重复多个字符串
- replace 替换字符串
- HasPrefix,HasSuffix,ToLower,ToUpper
- 等等(用的时候取看)
-
格式化打印
- 万能%v占位符
- 可以使用
%v来打印任意类型的变量,不需要区分数字字符串等其他类型。 - 可以使用
%+v来打印详细的结果,%#v则更加详细。
-
json
- go中的 JSON 操作非常简单,对于一个已有的结构体——只要保证每个字段的第一个字母是大写即公开字段:
- 那么这个结构体就能用 JSON.marshaler 去序列化;变成一个 JSON 的字符串。
- 序列化之后的字符串也能够用 JSON.unmarshaler 去反序列化到一个空的变量里面。
-
这样默认序列化出来的字符串,它的风格是大写字母开头,而不是下划线,可以在后面用 json.tag 等语法来修改输出 JSON 结果里面的字段名,代码如下所示。
type userInfo struct {
Name string
Age int `json:"age"`
Hobby []string
}
时间处理
-
在go语言里面最常用的就是 time.now() 来获取当前时间
-
可以用 time.Date 去构造一个带时区的时间,构造完的时间(具有一定格式,年,月,日,时分秒,毫秒,格式类型(time.UTC))
-
能用点 sub 去对两个时间进行减法,得到一个时间段,得到时间段后可以写相应的Minutes(),Seconds()……(对象.函数())
-
可以用 .UNIX 来获取时间戳,可以作为时间参数值设置随机种子
-
.Parse(初,末),最后可以获取时间戳(通过.UNIX)
数字解析(库)
- 库包:strconv
- 可以使用 Atoi 把一个十进制字符串转换成数字,可以用 itoA 把数字转换成字符串,需要两个变量接收参数
- 可以使用 ParseInt 或者 ParseFloat 来解析一个字符串,同理
- 比如ParseInt("111",2,64) 转到2进制,精度为64
进程
-
在 go 中,我们能够用 os.Args 来得到程序执行的时候的指定命令行参数。
- 比如 go run 程序path a b c d
- 你可以获得a b c d
- os.Args 会打印绝对path加后面的参数
-
os的库
- os
- os/exec
-
获取/写入环境变量
- os.Getenv("PATH")
- os.Setenv("AA","BB")
-
通过代码执行命令行命令
- buf.err:=exec.Command("grep","127.0.0.1","/etc/hosts").CombinedOutput()
- if err!=nil{panic(err)}
grep 用于查找文件里符合条件的字符串或正则表达式 但其实可能大家用的频率不高。
3 总结
- 重温之前的go语法,不过现在才来写这篇文章,说实话有点迟了
- 认真对待课程,有选择性的听课,达到高效学习的效果,互勉加油!