走进Go语言基础语法
优点:
- 高并发、高性能
- 语法简单
- 标准库多
- 完善的工具链
- 静态链接
- 快速编译
- 跨平台
- 垃圾回收
基础语法
- 后面不用 ; 结束语句
- 函数原生支持返回多个值。在实际的业务逻辑代码里面几乎所有的函数都返回两个值,第一个是真正的返回结果,第二个值是一个错误信息
- 变量类型是后置的
- 函数包里面函数名好像都是大写开头捏
- 赋值可以用=,新建变量用:=
变量声明
- var name = value
- name := value
- 变量性质写在变量名后面
常量声明
把var改成const即可
if else 语句
if 后面没有括号,后面一定要有{}
循环
只有for循环
- 可以什么都不写变成死循环
- 普通循环也不用括号
- 可以用break和continue
- for的条件不需要三个一定都有
Switch 语句
- 不用写break
- 可以取代部分 if else 的功能,可以在 switch 后面不加任何的变量,然后在 case 里面写条件分支
数组和切片
// 初始化
s := make([]string, 3)
//取切片中的一部分(也是从0开始计数)
fmt.Println(s[2:5])
// s[:5]和s[2:]以此类推
//增加元素
s = append(s,"d")
- 数组是固定长度的
- 切片用 append 添加元素(要用赋值给元素组的方法)
- 不支持负数指引
map/hash
//创建,例子内string为key的类型,int为value的类型
m := make(map[string]int)
//取key的value得用 m["key"](以上面例子为例)
//可以用OK确认map里面有没有这个key
r, ok :=m["unkonwn"]
//删除
delete(m,"one")
map遍历是没有顺序的!
range
对于 slice 或 map ,我们可以用 range 来快速遍历。 range 遍历的时候,
- 对于数组会返回两个值,第一个是key,第二个是value。
- 如果我们不需要key的话,我们可以用下划线来忽略。
nums := []int{1,2,3}
// usage one
for i,num := range nums{
// i is key, num is value
}
//usage two
for k:= range nums{
// k is key
}
指针
主要用途就是对传入的参数进行修改
- 传入函数的参数实际上是拷贝,在拷贝上修改不影响原本(
相当于没用) - 要起作用得写成指针类型,即在type前面和变量名前面都要加*
- 为了类型匹配,调用函数的时候在变量名前面加&
结构体
示例:
//创建一个叫user的type
type user struct{
name string
password string
}
初始化方式
用结构体的名称去初始化一个结构体变量
- 构造的时候需要传入每个字段的初始值。
- 用这种键值对的方式去指定初始值(这样可以只对一部分字段进行初始化)
- 指针
- 先 var, 然后用名字+.属性名的方式设置(不推荐)
类成员函数
在函数名前面加括号表示类
示例:
这里bool是返回类型,函数返回类型可以多个,用','隔开
fun (u user) check(password string) bool{
return u.passowrd=password
}
同样,只有带指针才能对结构体进行修改,要放在结构体类型那里,如上为user前面加' '
错误处理
- 要import errors
- 变量类型为error
- 出现错误返回nil和error,正常返回原本结果和nil(对于返回一个值和一个error的函数来说,剩下以此类推)
字符串操作化
- 要import strings
- contains 判断一个字符串里面是否有包含另一个字符串
- count 字符串计数
- index 查找某个字符串的位置
- join 连接多个字符串
- repeat 重复多个字符串
- replace 替换字符串。
字符串格式化
- 在fmt中有相关方法
- 用%v 可以打印任意类型变量
- %+v 打印详细结果,%#v 则更详细。
- 可以用来精确限制打印几位数的小数(比如打印小数点后两位的用%.2f\n)
例子:
fmt.Printf("s=%v\n",s)
fmt.Printf("p=%+v\n",p)
JSON 处理
- 要import encoding/json
- 对于一个结构体,只要保证每个字段的第一个字母是大写,也就是是公开字段。那么这个结构体就能用 JSON.Marshaler 去序列化,变成一个 JSON 的字符串
- 序列化之后的字符串能用 JSON.Unmarshaler 去反序列化到一个空的变量里。这样默认序列化出来的字符串,风格是大写字母开头,而不是下划线。我们可以在后面用 json tag 等语法来去修改输出 JSON 结果里面的字段名。
- 可以用在结构体属性定义后面加
json: "newName"来使输出JSON结果内这个属性字段名为newName - 用Print打印JSON字符串要用先化为string,可以用string("JSON")来,这里的JSON代指JSON字符串
时间处理
- time.now() 获取当前时间
- time.Date 构造一个带时区的时间
- . Sub 去对两个时间进行减法,得到一个时间段。时间段又可以去得到它有多少小时,多少分钟、多少秒。
- 用 .UNIX 来获取时间戳。返回的都是距离UTC时间:1970年1月1日0点0分0秒的秒数。
- time.Format改格式。不是用"yy mm dd"的格式而是用一个固定的时间(懒得打了有空再搜吧)
- time.Parse把时间字符串转换为Time,时区是UTC时区。
数字解析
- import strconv
- 用 ParseInt 或者 ParseFloat 来解析一个字符串。
- 用 Atoi 把一个十进制字符串转成数字。可以用 itoA 把数字转成字符串。
- 如果输入不合法,那么这些函数都会返回error
n,_ :=strconv.ParseInt("111",10,64)
进程信息
- import os 和 os/exec
- os.Args 来得到程序执行的时候的指定的命令行参数。比如我们编译的一个 二进制文件,command。 后面接 abcd 来启动,输出就是 os.Args 会是一个长度为 5 的 slice ,第一个成员代表二进制自身的名字。
- 我们可以用 os.Getenv来读取环境变量。用os.Setenv来设置环境变量
- 可以用exce.Command()来执行语句返回一个cmd对象