NOTE
Go语言学习
1. Golang的特点 编译型,因此不需要虚拟机 静态类型 有GC,内存管理全自动 1.1. Golang vs Java Go Java 虚拟机 无 有 跨平台 支持,依赖编译器在不同平台编译 支持,依赖JVM一次编译,到处执行 类型 编译型 解释型 内存管理 GC,自动 GC,自动 编程范式 面向过程、面向对象、函数式、面向消息 面向对象 生态 不完善。需要自己组合 完善。基于Spring业务开发 Go的内存管理类似于操作系统的虚
这是历史学习笔记,可能存在过时或不完整的理解。
1. Golang的特点
- 编译型,因此不需要虚拟机
- 静态类型
- 有GC,内存管理全自动
1.1. Golang vs Java
| Go | Java | |
|---|---|---|
| 虚拟机 | 无 | 有 |
| 跨平台 | 支持,依赖编译器在不同平台编译 | 支持,依赖JVM一次编译,到处执行 |
| 类型 | 编译型 | 解释型 |
| 内存管理 | GC,自动 | GC,自动 |
| 编程范式 | 面向过程、面向对象、函数式、面向消息 | 面向对象 |
| 生态 | 不完善。需要自己组合 | 完善。基于Spring业务开发 |
| Go的内存管理类似于操作系统的虚拟地址空间,把内存分为等块大小 |
2. 环境搭建
3. 关键字
3.1. for
3.1.1. for循环的不同形式
3.1.1.1. 经典for循环
func TestFor1(t *testing.T) {
//for (init;before;after)
sum := 0
for i := 0; i < 10; i++ {
sum += i
}
fmt.Println(sum)
}
//输出
45
3.1.1.2. while循环
func TestFor2(t *testing.T) {
//while(xxx)
x := 0
for x < 10 {
fmt.Println(x)
x = x + 1
}
}
//输出
0
1
2
3
4
5
6
7
8
9
3.1.1.3. 死循环
func TestFor3(t *testing.T) {
//for(;;)
for {
fmt.Println("test")
}
}
3.1.1.4. 增强for循环
func TestFor4(t *testing.T) {
// 遍历数组、切片、字符串或者映射,或从信道中读取消息
oldMap := map[int]string{
1: "a",
2: "b",
}
newMap := make(map[int]string)
for k, v := range oldMap {
newMap[k] = v
}
fmt.Println(oldMap, newMap)
}
//输出
map[1:a 2:b] map[1:a 2:b]
3.1.1.4.1. 并发问题
增强for循环遍历的是同一个地址,如果是并发中会有问题
func TestFor5(t *testing.T) {
arrays := []uint64{1,2,4}
for _, val := range arrays {
fmt.Println(&val, val)
}
}
//输出
0xc00000a310 1
0xc00000a310 2
0xc00000a310 4
- 解决:使用局部变量
func TestFor6(t *testing.T) {
arrays := []uint64{1,2,4}
for _, val := range arrays {
tmpVal := val
fmt.Println(&tmpVal, tmpVal)
}
}
//输出
0xc00000a310 1
0xc00000a320 2
0xc00000a330 4
3.2. switch
- 不需要break
func TestSwitch1(t *testing.T) {
unhex('0')
}
func unhex(c byte) {
switch {
case c >= '0':
fmt.Println("c>=0")
case c == '0':
fmt.Println("c==0")
default:
fmt.Println("c<0")
}
}
//输出
c>=0
- 加了break也行
func TestSwitch2(t *testing.T) {
unhex2('0')
}
func unhex2(c byte) {
switch c {
case '0':
fmt.Println("0")
case '1', '2':
fmt.Println("1")
break //自己加break也ok,下面的qqqqq不会输出
fmt.Println("qqqqqqqqqqqqqq")
default:
fmt.Println("others")
}
}
//输出
0
3.3. select
3.4. defer
3.5. panic和recover
3.6. make和new
4. 类型系统
5. 数据结构
5.1. string
5.2. array
5.3. slice
5.4. map
5.5. struct
6. 函数
7. 接口
8. 包
9. 依赖管理
10. 并发
11. 反射
12. 错误
13. 单元测试
14. benchmark
15. 调试
16. 内存管理
17. GC
18. 指针
19. 构建过程
20. 性能优化
21. core dump
调试Go语言的核心转储(Core Dumps) - SegmentFault 思否 golang coredump分析 - 代码先锋网
22. 参考资料
- Documentation - The Go Programming Language
- A Tour of Go
- Effective Go - The Go Programming Language
- The Go Programming Language Specification - The Go Programming Language
- Packages - The Go Programming Language
- 如何研究Go内部实现 · 《深入解析go》
- Go 语言设计与实现 | Go 语言设计与实现
- Introduction · Go语言高级编程
- 随笔列表第2页 - 爱写程序的阿波张 - 博客园
- 编程语言 | qcrao
- a-journey-with-go
- https://mp.weixin.qq.com/mp/homepage?__biz=Mzg5NjIwNzIxNQ==&hid=3&sn=763be099a57984aae1baef3f45b38db7&scene=1&devicetype=Windows+10+x64&version=6302018f&lang=zh_CN&nettype=cmnet&ascene=1&session_us=gh_b3e3966468b1&wx_header=1&uin=&key=&fontgear=2
- golang和java,谁才是最终答案? - 知乎
讨论
使用 GitHub 账号参与讨论,评论会保存在 GitHub Issues 中。在 GitHub 查看