这是我参与「第五届青训营」伴学笔记创作活动的第1天
Go语言入门
开发环境
-
安装Go
-
在Golang官网下载对应平台的安装包
-
安装后,配置环境变量
新建系统变量GOROOT,值为Go的安装路径
双击Path变量,能看到自动添加的Go环境变量,Go的安装路径\bin
-
-
配置IDE
Goland:直接安装即可,无需做过多配置
基础语法
入门案例
package main
import (
"fmt"
)
func main(){
fmt.Println("hello world")
}
package main代表该文件属于main包的一部分,main包是程序的入口包,代表该文件是程序的入口文件
导入了标准库里面的fmt包,这个包主要用于向屏幕输出字符串,格式化字符串
main函数为程序入口,函数中调用了fmt.Println来输出hello world
此外还可看出如果Go一行上只有单条语句,不需要使用分号
变量 常量
声明变量的一般形式(可以一次声明多个)
没有初始化,默认为零值
变量类型后置,Go支持类型自动推断,为变量初始化时可以省略类型
var identifier [type] = value
可简写为
identifier := value
常量即使用const替代var
const identifier [type] = value
if else
if后面的布尔表达式没有括号,执行语句必须有大括号
if 布尔表达式 {
...
} else if 布尔表达式 {
...
} else {
...
}
循环
Go只有for循环,有3种形式
-
和c的
for一样:for init;condition;post { ... } -
和c的
while一样:for condition { ... } -
无限循环:
for { ... }
switch
switch默认case最后自带break语句
可以使用fallthrough来强制执行后面的case语句
switch [var1] {
case value1:
...
case value2:
...
default:
...
}
数组
var a1 [SIZE]type
a2 := [SIZE]type{...}
真实业务中很少使用数组,因为长度固定,更常用的是切片
切片
切片是一个长度不固定的数组,有更多的操作
s := []type {val1,val2...}
或者使用make()函数来创建一个切片
len为切片的初始长度
capacity是可选参数,用来指定容量
s := make([]type, len, capacity)
append()和copy()函数
切片可以使用append()函数追加元素
append在操作的时候,如果容量不够,会发生扩容并返回一个新的切片,所以需将append的结果赋值给原切片。
copy()函数可以在两个切片间拷贝数据
切片的截取
可以通过[lower-bound:upper-bound]来截取切片
左右数字均可省略,左省略表示从第0个开始,右省略表示到最后一个
map
使用make来创建map
type1:键的类型
type2:值的类型
m1 := make(map[type1]type2)
提前初始化map
m2 := map[type1]type2{key1 : value1,key2 : value2...}
通过[]语法进行键值对的读写
m[key] = value
fmt.Println(m[key])
读有两个返回值,第二个值是布尔值,用来判断key是否在map中存在
v,ok = m[key]
使用delete()函数删除键值对
delete(m,key)
range
for range用于遍历数组、切片、map
range会得到两个返回值
不需要某个值时,可用_忽略
遍历数组、切片时一个是索引,一个是对应值
for idx, value := range s {
s[idx] = value
}
遍历map时一个是键,一个是值
for key, value := range m {
m[key] = value
}
函数
格式如下:
func function_name( [parameter list] ) [return_types] {
函数体
}
指针
Go初步支持指针,相比c和c++,支持的操作非常有限
指针的主要用途是对常用参数进行修改
结构体
结构体是带类型字段的集合
定义结构体
type struct_name struct {
member_name1 type1
member_name2 type2
...
}
初始化结构体
可以用结构体名称来初始化一个结构体变量
通过.操作符来访问结构体对象
variable_name := struct_name(value1,value2...)
//或
variable_name := struct_name(key1:value1,key2:value2...)
struct_name.member
结构体作为函数参数
有指针和非指针两种用法
使用指针可以实现对结构体进行修改,某些情况下,避免大结构体拷贝的开销
结构体方法
结构体方法也分为有指针和非指针两种用法
有指针便可以实现对结构体进行修改
声明方式如下:
func (s struct_name) function_name( [parameter list] ) [return_types] {
函数体
}
之后便可以直接调用
s.fuction_name( [parameter list] )
错误处理
不同于Java使用的异常,Go用单独的返回值来传递错误信息,能很清晰知道哪个函数返回了错误,并能用简单的if else来处理错误
在函数的返回值里面加上一个error,代表这个函数可能返回一个错误
导入errors包,使用errors.New便可返回一个错误信息
标准库
标准库strings包有字符串操作功能
在标准库fmt包下有字符串格式化功能
在标准库encoding/json包下有JSON处理功能
在标准库time包下有时间处理功能,Go使用的不是传统的时间模板,而是2006-01-02 15:04:05一个特殊的时间
在标准库strconv包下有数字解析功能
在标准库os、os\exec包下有获取进程信息功能