这是我参与「第五届青训营 」伴学笔记创作活动的第1天
go语言语法
因为之前用到的比较熟悉的语言是C++,因此我主要谈谈通过这节课程我学到的go语法与C++的不同之处。
变量
go是强类型,变量都有类型,声明变量时常用方式:
var varname type = value:需var关键字且类型放后面varname := value:会自行推到类型
字符串
go的strings包有很多常用函数:
- contains判断是否包含另一字符串
- count字符串计数
- index查找字符串位置
- join连接多字符串
- repeat重复多个字符串
- replace替换字符串
字符串格式化
fmt包中有很多字符串格式化相关的方法,但常用“%v”打印任意类型变量,不需区分类型,“%+v”和“%#v”则更详细
字符串和数字转换
字符串和数字间转换通过strconv包的函数,Atoi表示字符串转数字相反则Itoa C++ 则是s.stoi()和to_string()函数来转换
if else判断
if后无括号,写括号的话编辑器会自动去掉,且后面必须接大括号
switch判断
switch后变量名无括号,case中不加break,且可以使用任意变量类型,当判断较多时可用switch完全替代if else
for循环
只有唯一的for循环,for中三语句任何语句都可省略且也没括号,循环中可用break或continue跳出或继续循环
range
常用range快速遍历数组、slice、map等,返回索引和值,可用“_”忽略索引
数组
类似其他语言中固定长度数组,实际很少使用,更多使用切片
切片
slice长度不固定,用make创建,append时自动扩容,可像python中切片一样截取
map
类似C++中的unordered_map,实际使用最频繁的数据结构,用make创建,常用val, ok:=m[key]写法,通过判断ok判断是否存在key对应的val
函数
参数和返回值类型后置,支持返回多个值,实际代码中几乎所有函数返回两个值:结果和错误信息,注意参数是都值传递,若想修改参数,需传递指针。首字母大写表示公共函数,类似C++中public函数,可包外访问
指针
类似C/C++指针,但操作有限,指针主要用途是对传入参数修改
结构体
结构体初始化时需传入每个字段初始值,也可键值对的方式初始化,通常用结构体的指针作为参数,既能修改结构体又能避免结构体的拷贝开销,
- 字段首字母大写表示公开字段,类似C++中public
- 字段首字母小写表示私有字段,类似C++中private
结构体方法
再函数名前带上结构体参数和括号,就实现类似其他语言中的类成员函数
错误处理
go常见做法是再传递结果的返回值的基础上,新增一个传递错误信息的返回值,这样能清晰知道哪个函数出错,且能用简单的if else处理错误
defer处理
go中为避免资源泄露,需用defer手动关闭资源,会在函数运行结束后执行
json处理
对已有结构体,保证每个字段首字母大写,是公开字段,就能用marshaler序列化变成json字符串,unmarshaler反序列化,可用json tag修改输出结果的字段名
时间处理
time包包含时间处理各种函数,用Date构造带时区时间,Now获取当前时间
进程处理
os包包含进程处理,Args得到命令参数,Getenv读环境变量,Command执行命令
以上就是个人总结Go语言的一些基础语法的使用规则。