Go语言入门-基础上手|青训营笔记
这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
0. go语言的特性
- 高性能,高并发
- 语法简单
- 丰富的标准库
- 完善的工具链
- 静态链接:上线包可以做的很小
- 快速编译:编译时间在数秒
- 跨平台:跨平台,且支持交叉编译
- 垃圾回收
1. 开发环境配置
官方网址:go.dev
国内镜像:studygolang.com/dl
配置代理,加速第三方库的下载(类似pip换源):goproxy.cn,网页内有配置指导
开发环境:首选VSCode,下载完成后在左侧栏内安装go语言相关插件
2. 第一个HelloWorld程序
2.1 从hello world看程序的构成要素
package:指定包,包名需要使用双引号
{}:语句块
import:导入标准库
func:定义函数
fmt:标准io库,可以通过编辑器的lsp功能查看可选函数,标准库中的函数通常以大写字母开头
package main
import {
"fmt"
}
func main() {
fmt.Println("hello world")
}
2.2 编译运行
编译运行:go run <filename>.go
编译成为可执行文件之后运行:编译 go build <filename>.go 运行 pathtofile/<filename>
3. 变量和常量
3.1 变量类型
go语言是强类型语言,每个变量都有其对应的类型
常见的数据类型有:字符串,整形,浮点型,布尔型
字符串是go语言中的 “一类公民“ ,可以直接作为参数和返回值,使用加号拼接
变量声明
声明的三种可能要素:声明,初始化,赋值
- 声明:显示类型
var 变量名 变量类型
-
赋值:变量隐式声明
变量名 := 已有变量/字面量-> 这一种最简洁,在循环等结构中常用 -
声明+初始化:
- 显式类型:
var 变量名 变量类型 = 字面量-> 这一种最容易读懂,有利于代码规范 - 隐式类型:
var 变量名 = 常量
- 显式类型:
注意区别变量初始化
=与变量赋值:=
3.2 常量
常量使用关键字const来声明(用法约等于上面的var)
常量没有指定的类型,在编译时根据程序上下文确定
4. 程序控制流
4.1 if else
if 条件 {} else {}:注意条件不需要使用括号包裹 ,不过编译器会自动去除多余括号
语句块必须要分行书写,不能写在同一行
4.2 for/while 循环
在go语言中,for/while循环都使用for关键字实现,
for 循环分句 {}:循环分句可以使用c语言中for循环或者while循环的格式从而实现不同的循环,同样注意循环分句不需要使用括号包裹
什么都不写代表死循环
continue:进入下一轮循环
break:跳出循环
4.3 switch 语句
switch 变量 {case 字面量: 语句 ...}
注意与c语言中的区别,默认只会完成一个case,不需要break语句
go语言中强大的switch语句:判断的变量可以使用字符串,结构体,也可以什么都不加,在case当中书写条件,从而优雅完成分支较多的判断流
5. 数组与切片
数组长度固定而切片长度可变,实际场景中更常使用切片
一个疑问,似乎数组和切片通常通过隐式的方法进行声明,也许是其声明语句本身已经有较强的可读性,还是说数组和切片并不属于基础类型?
5.1 数组定义
数组声明:var 数组名[数组长度]变量类型
列表初始化:数组名 := [数组长度]变量类型{初始化列表}
二维数组定义:var 数组名 [m][n]变量类型
5.2 切片定义
切片声明:切片名 := make([]变类型, 初始长度)
列表初始化:s := []变量类型{初始化列表}
dst=append(dst, src):如果不扩容返回dst地址,如果扩容返回扩容后地址
copy(dst, src):这里src和dst需要长度相等吗?
s[si:di]:注意索引不可以用负数,左开右闭
6. map
map声明:m := make(map[key]val)
列表初始化:m := [key]val{key:val列表}
r, ok := m[key]:有两个返回值,后一个表示key是否存在
赋值的特点,左右两侧可以有不对等的变量数量和值,多余的值会被忽略,如果变量多余呢?
delete(m, key)