这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记
go 语言的特点
-
高性能、高并发
- go的性能堪比C++
- go原生支持高并发,不依赖第三方库
-
语法简单
- 本来以为 C 已经够简单了(基础语法),没想到 go 在 C 的基础上还能做优化
- 举例:循环只有 for 一个
- 但是去掉不必要的括号emmm,可能是区别于其他语言吧,一开始还是很不好上手的
-
丰富标准库
-
完善工具链
- 编译
- 代码格式化(★大家都一样)
- 错误检查
- 帮助文档
- 包管理
- 代码提示
- 完整的单元测试框架内(★强)
-
静态编译
- 只需要拷贝编译后的唯一可执行文件就可以运行
- (怎么感觉越来越像 dev 了,代码格式化和编译生成的可执行文件方面)
-
快速编译(这个也是强的★)
-
跨平台
-
垃圾回收
总结一下:go是真的很强,python的代码量,c的执行速度 不是吹的
go的基础语法
-
变量
-
变量类型
- 字符串(内置类型)
- 整数
- 浮点数
- bool型
-
变量的声明
-
自动推导变量类型
var a = "init" -
显示定义
var a, b int 1, 2 -
变量名 := 值
f := float32(3.14) //注意 float //是错误写发 float32 //正确写法 float64 //正确写法
-
-
-
判断语句
不带 ()
if 2>1{ fmt.Println("true") }else{ fmt.Println("false") }在golang里面试了一下,if 后面加括号了,编译的时候,编辑器自动去掉了
这也就说明,在 go 里面不支持 if 判断里面有多个语句
-
循环语句
-
for 后面啥都不写 死循环
for { fmt.Println("Hello World") } -
三语句经典for循环,去掉 多余的括号
for i := 0; i < 10; i++ { fmt.Println("Hello World") }i++ 和 i-- 在 Go 语言中是语句,不是表达式,因此不能赋值给另外的变量。 此外 没有 ++i 和 --i 。
表达式是可以被求值的代码,而语句是一段可执行代码。
我只能表示,学到了!
-
只写判断语句(这个在C里面好像要写两个空语句,我以为在go里面需要占位呢)
//第一个 i := 0 for i<3{ i++; fmt.Println(i) } //第二个 for i:=0; i<3;{ i++; fmt.Println(i) } //比较一下,发现,go也需要占位
-
-
选择语句
-
不需要 break
i := 2 switch i { case 1: fmt.Println("one") case 2: fmt.Println("two") case 3: fmt.Println("three") case 4, 5: //还能这样?反正C不支持 fmt.Println("four or five") default: fmt.Println("other") }是不是可以这样理解,你按照C的严谨来写,肯定对。
有一说一,有点JavaScript和Java之间的感觉了
-
支持任意类型的变量类型
t := time.Now() switch { case t.Hour() < 12: fmt.Println("yes") }
-
-
数组
定义的格式:var 数组名 []变量类型
var arr [5]int arr[0] = 0 fmt.Println(arr[0]) //竟然可以这样输出 var arr [5]int arr[0] = 1 fmt.Println(arr) //输出结果 [1 0 0 0 0] -
切片
定义格式:变量名 := make([]变量类型,长度)
s := make([]string, 3)扩容
s = append(s,"d") s = append(s,"e","f") -
map(又名hash,字典) ==> 一种数据结构
定义格式:hash := make(map[string]int)
键值对
通过 delete 删除键值对
-
range 快速遍历
-
对于数组返回 index 和 元素
-
对于map返回 key 和value
index, num := range nums
-
-
函数
- 定义格式:func 函数名(参数1,参数2……)返回值类型(写起来确实有点难受)
- 支持返回多个值(头大,好奇,反正C不支持,其实可以思考一下,一个函数到底该不该支持返回多个值呢?这估计是个哲学问题)
-
指针(弱化了的,也可能是C的指针太强了,毕竟指针是C的灵魂)
引入指针是为了方便对传参进行修改,这点让我想起了学C指针的第一个程序
void function(int a){ a = a+1; printf("%d",a);//a1 } printf("%d",a);//a2 //问a1 和 a2的值相同吗? //至于为什么无法修改,涉及到传参机制和函数运行压栈的问题 //结论是我们要学指针 -
结构体
定义结构:type 结构体类型名 struct
type user struct{ name string pwd string }对比看一下C代码实现上述情况
typedef struct USER{ //内部就不写了,C没有string类型 }user; -
结构体函数
-
类似于类成员函数
不得不说,go是真的很强
-
-
错误处理
利用函数可返回多个值
目标值,错误信息
-
格式化输出
- 可以用 %v 来代替指定变量类型,这样就会自动识别输出的类型
- 也可以用 %#v 进行控制输出,这样就会输出相信的信息
- 其余的和C的printf 没有相似
-
JSON处理
-
可以之间对返回的JSON串进行读取,并拿到信息,但是不推荐
-
一般先定义一个和JSON值相对应的结构体,注意 结构体成员变量名的第一个字母应该大写
发现一件事情,go 里面提供的方法(特别是流的转换方法)都习惯返回两个值,第二个是报错信息
-
-
时间处理
提供了 time 时间包,最常用的还是
t := time.Now() //获取当前时间当然,go 也支持 指定对象时间 和 时间戳 操作
- 可以用 time.date 构造一个带时区的时间
- 可以用 .UNIX 获取时间戳
当然,还有一个神奇的日期,这个是写死的。用这个来格式化时间
2006-01-02 15:04:05 func main() { timeString := time.Now().Format("2006-01-02 15:04:05") fmt.Println(timeString) } -
数字解析
- 从流中读取字符串,并将字符串转数字
- 调用 strconv.ParseInt(字符串,进制,整型位数) 将返回一个整数 和 转换信息(是否转换成功)
- 调用 strconv.ParseFloat(字符串,浮点型位数) 将返回一个浮点数 和 转换信息(是否转换成功)
- 调用 strconv.Atoi(字符串)
a, _ := strconv.Atoi("12.3") b, _ := strconv.Atoi("123") fmt.Println("a =", a, "b =", b) // 输出结果 // a = 0 b = 123 -
进程信息
总体来说,课程的知识密度很大,不水,很干。
感觉go 语言和 C 语言和相似,但是又更方便,当然一开始肯定会感觉有些别扭
希望能坚持下来,加油!