这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
本文同步发布于博客(xblc.netlify.app),如果有更新博客会在第一时间更新
主要参考圣经 gopl.io 和字节青训基础课
介绍
package main
import "fmt"
func main() {
fmt.Println("Hello, 世界")
}
主要介绍:
-
编译型语言。高性能,高并发。
- 和C一样导入包(packages),类比C中的库(libraries)
- 统一用
go命令运行、编译 - 编译速度吊打C++
- 性能要求严格,如变量或者包没使用的话没法过编译
-
强调轻量性、简单性(代码强制统一格式化)
-
适合用于并发编程(减少复杂性)
和C的基础区别:
- 主要函数是一个 “main包”
package main - 分号不是必要的。但是也可以加上,表示一个语句的结束
- Go语言比较有“强迫症”,格式规范很严格,很多简写都写不了,语句基本的都是独一无二的,没有第二种写法
其他特性:
- 标准库非常丰富。不需要依靠性能没有保障的第三方库就能完成大部分开发。
- 完善的工具链。诞生之初就设计好了格式化、单元测试框架、代码补全等工具。
- 静态链接。编译之后得到的可执行文件可以 All-in-One,所有代码和库都静止在一个文件里面。
- 跨平台。能够在各种奇怪平台上运行。
- 垃圾回收。自动的代码优化,不要考虑内存释放。可以理解为不适合底层学习但是又有许多性能优化,有点C到Python的一个折中的感觉。
基础语法
变量和控制
变量:
-
变量类型的指定
-
var声明变量
- 自动变量类型,可以不声明但一定要有值
:=赋值,同 Matlab 和 Pascal
- 后跟变量类型的指定
- 然后才是赋值
- 自动变量类型,可以不声明但一定要有值
var a = "ss"
var c, d int = 3, 5
fmt.Println(a, c, d)
// b = "ss";
b := 3
fmt.Println(b)
条件:
- if 无括号
- Switch 不会顺次执行
实测 for 后面接一个条件或者三个条件
for i := 1; i < n; i++ {}
for j <= 3 {}
t := 5
for ;t > 0 ; t-- {}
(条件一定要写不等式;代码段一定要打括号)
数组和切片
数组:长度固定
依次验证
- 会把值初始化为
0 - 可以直接输出一整个数组,注意数组直接表示出来的话一定要前置类型 “二维数组”
[][]int - 不允许在声明时
赋值定义二维数组的值
var arr [5]int
fmt.Println(arr[1], len(arr))
arr1 := [][]int{{1, 1}, {1, 0}}// auto size is allowed
fmt.Println(arr1)
//[[1 1] [1 0]]
// arr2 := {4, 1, 4} !
// var arr2dem [3][2]int = {1, 3, 1, 5} !
// var arr2dem [3][2]int{1, 3, 1, 5} !
// var arr2dem [3][2]int{{3, 4}, {1, 4}, {4, 1}} !
// var arr2dem [3][2]int = [][]int{{3, 4}, {1, 4}, {4, 1}}
// cannot use ([][]int literal) (value of type [][]int) as [3][2]int value in variable declaration
// fmt.Println("arr2 = ", arr2dem)
切片
make()和append()函数均用来返回一个数据类型[]string表示字符串数组类型,如果没有初始化的话不是空字符而是空格
sl := make([]string, 3)
// append(sl, "111")
sl = append(sl, "111")
fmt.Println(sl)
//[ 111]
fmt.Println(sl[3])
//[111]
str_arr := []string{"aa", "bb"}
fmt.Println(str_arr)
函数和结构体
函数
- 返回类型后置
- 经常返回多个类型。第一个表示真正返回值,第二个表示状态
结构体
- 结构体方法:类比类成员函数。
- 使用方法是前函数前置
字符串
操作:
格式化:
- 详细和非常详细式输出
其他
map
- 初始化会是
0, false这些 - 完全无序,偏随机
range
- 同时表示 key 和 val,可以和
for结合使用for key, val := range arr/map
指针
- 作用非常有限
- 操作方式和C一样
常用包
JSON 处理
- 序列化和反序列化
json.Marshal - 注意进行
string()类型处理 - 输出风格规定?
错误处理
时间处理
- 导入包以后就可以直接向结构体一样使用一个时间类型,用一些函数来操作时间
- 可以按照
yy-mm-dd hh:mm:ss的格式来解析or格式化一个时间串 - 时间戳
数字解析
- 解析格式:字符串,进制,精度
进程信息
- 获取命令行参数
- 获取写入环境变量
- exec获取什么得到输入输出