GO 语法 | 青训营笔记

130 阅读6分钟

1 目标

  • 主要是自己看的这个笔记,便于后续再进行复习
  • 语法栏目,当然搞清楚语法

2 GO语法

前提

  • 环境配置
    • vscode 有个go插件
      • 需要按ctrl+shift+p 调出命令面板
      • 输入go install tools 选Go: Install/Update Tools
    • golang最好,功能全,学生学习比较好
    • 说明
      • GOPATH: Go项目的位置,用GO MOD来管理项目
      • GOROOT: 这个就是我们的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}
  • 切片
    • 切片不同于数组,它可以任意的更改长度,同时也具有更多丰富的操作
    1. make创建切片
      • s:=make([]string,3)
    2. 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 包里面有很多常用的字符串工具函数

  1. contains 判断一个字符串里面是否有包含另一个字符串
  2. count 字符串计数
  3. index 查找某个字符串的位置
  4. join 连接多个字符串
  5. repeat 重复多个字符串
  6. replace 替换字符串
  7. HasPrefix,HasSuffix,ToLower,ToUpper
  8. 等等(用的时候取看)
  • 格式化打印

    • 万能%v占位符
    1. 可以使用 %v 来打印任意类型的变量,不需要区分数字字符串等其他类型。
    2. 可以使用 %+v来打印详细的结果,%#v则更加详细。
  • json

    • go中的 JSON 操作非常简单,对于一个已有的结构体——只要保证每个字段的第一个字母是大写即公开字段:
    1. 那么这个结构体就能用 JSON.marshaler 去序列化;变成一个 JSON 的字符串。
    2. 序列化之后的字符串也能够用 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语法,不过现在才来写这篇文章,说实话有点迟了
  • 认真对待课程,有选择性的听课,达到高效学习的效果,互勉加油!

4 引用