Go语言的优点
- 高性能,高并发
- 语法简单,学习曲线平缓
- 就是好学呗
- 丰富的标准库
- 很多东西不用引用第三方库就可以实现
- 又全又好用(心动~)
- 完整的工具链
- 静态链接
- 快速编译
- 能让C++程序员羡慕到哭
- 跨平台
- 能在LInux,Widows,MacOS上运行
- 还能在自己电脑上编译好一个可执行文件放到路由器上执行
- 垃圾回收
变量的定义方式
- var name=value
- name:=value
- 感觉可以理解为,把var这个单词,简化成冒号了
- var name type
- 之后赋值的时候再
- name =value
常量的定义方式
- const name type = value
for关键字的使用
- 和C语言的区别之处
- for后面不用加小括号
- 用法
- 去掉括号后的经典C语言for循环三个条件
- 也可以看情况去掉后面紧跟的三个条件
- 也可以就 单独一个for,后面就是大括号,这个就是一个死循环了
- continue和break和C语言用法相同
强大的switch
- 和C语言不同的是,不需要break,到了每个case运行对应的代码段之后就退出了
- 也可以switch后面不加变量,每个case后面接上判断条件
- 甚至还可以用他取代if else语句
数组和切片
- 数组定义方式:var name [number]type
- 不过在实际开发中,数组并不如切片更常用,因为数组长度是固定的
- 切片方式:可以任意地更改切片的长度
- 切片的定义方式: name :=make([]type, lenth)
- 其实就是相比数组的定义方法,方括号里面不指定长度,就是一个切片了
- 切片加入元素的方式: name = append(name , value)
- 这就把value这个值加入到name这个切片中去了
- 小tips:如果知道某个切片的大致最终长度,可以在定义的时候就指定长度,不够了再append,如果一开始定义一个空的切片,之后一次一次地将其变长,速度是要慢一些的
- 切片一个很好用的功能: newname := name[a:b]
- 就会将name切片,从下标a到下标b-1 裁剪出来,赋值给newname
map
-
特别好用的数据结构
-
在其他语言中名字为哈希或者字典
-
创建方式: name:= make(map[keytype]type)
- 其中keytype是key值的类型,type是数据的类型
- 使用的时候可以根据key的值找到其对应的数据
-
想要知道某个key对应的值存在与否。 可以使用以下方式
-
r, ok := name[keyvalue] -
如果ok返回的是true,则说明存在,如果返回false,则说明不存在
-
-
且map的一个特点,一个map中所有的键值对是完全无序的
range
- 用于遍历
- 需要了解的地方:其返回的第一个值是索引,第二个值才是遍历到的值
- 如果不需要索引,可以用下划线 "_"放在索引的位置,同理,其他如果有不想要的返回值,就可以用下划线放在对应的位置上
函数
- golang的函数是原生支持返回多个值的。通常第一个值是返回的结果,第二个值是报错的信息
指针
- 相比C的指针,golang的指针作用非常有限。主要用于修改值(指针受苦者福音)
- 用法和C语言差不多
结构体
- 基本用法和C类似
- 在golang中可以为结构体定义方法,比较像其他语言的类的成员函数
错误处理
- 在某个函数的返回值列表里面加一个error
- 常用的判断错误方法:
- 调用一个函数的时候,接收返回值,除了要用的那些数据,还接收error返回值,紧接着就判断error是否带有报错信息,有的话,就进行对应的处理
字符串格式化
- 对于printf,你可以用
- %v来打印任意类型的变量
- %+v打印字段的名字以及值
- %#v打印出结构体整个构造的类型名称,字段和值
Json操作
- 对于go语言的结构体,只需要保证结构体每个字段,第一个字母是大写(表示公开性),然后调用json.Marshal就可以将其转换成“字符串类型”
- 同理Unmarshal的功能就是反过来
时间处理
- 最常用的操作就是time.Now() ,可以快速获取当前时间
- time.Date构造一个带时区的时间
- time.Sub获得一个时间段当前时间与传入的时间,相差多少分钟多少秒
进程信息
- os.Args()获取进程在执行的时候的一些命令行参数
- os.Getenv()获取环境变量
- os.Setenv()写入环境变量
- exec.Command()创建子进程,并且获得其输入输出