第03讲 Go语言详细介绍与IDEA安装
本讲义基于视频实际讲解内容整理
一、IDEA编辑器安装
老师在本讲中主要做了两件事:
- 解压并安装了IDEA编辑器(Go语言开发工具)
- 详细介绍了Go语言的设计哲学和特性
老师提到:Go语言编译完就是一个exe,非常方便。Go语言专门写服务端、写高并发的程序,薪资也高。
二、Go语言圣经
老师推荐了《Go语言圣经》(英文原版 The Go Programming Language),并分享了PDF版本。
三、Go语言的历史与定位
3.1 21世纪的C语言
Go语言有时候被描述为 "C类似语言",也就是 21世纪的C语言。
Go从C语言继承了:
- 相似的表达式语法
- 控制结构
- 基本数据类型
- 调用的参数传值
- 指针的很多思想
- C一直看重的 编译后机器码的运行效率(编完之后直接就是机器码)
3.2 Go项目的设计背景
所有编程都反映了设计者的编程哲学反思。Go项目是谷歌公司在维护超级复杂的系统软件时遇到问题的反思。
主要设计者:Rob Pike(罗布·派克)等。
3.3 Go项目的组成
Go项目包括:
- 编程语言本身
- 相关的工具
- 标准库
老师类比:和C语言一样,C里面也有标准库,都是现代语言的标配。
四、Go语言的设计哲学
4.1 Go有的特性
| 特性 | 说明 |
|---|---|
| 自动垃圾回收 | 不需要手动管理内存,避免内存泄漏、CPU过载 |
| 包系统 | 由不同的包堆叠起来构建程序,类似搭积木 |
| 函数作为一等公民 | 函数是最基本的组成单元 |
| 词法作用域 | 变量的作用范围由代码结构决定 |
| 系统调用接口 | 可直接调用操作系统接口 |
| 字符串和切片 | 内置支持 |
4.2 Go没有的特性
| 不支持的特性 | 说明 |
|---|---|
| 隐式数值转换 | 不会自动将字符串转整型、整型转浮点型等,必须显式转换 |
| 构造函数 | 没有类似Java的构造方法(类启动时执行) |
| 析构函数 | 没有对象销毁时执行的方法 |
| 运算符重载 | 不支持 |
| 函数重载 | 不支持 |
| 继承 | 不支持 |
| 泛型 | (当时)不支持 |
| 异常 | 没有try-catch机制 |
| 宏 | 没有预处理宏 |
| 线程局部存储 | 不支持 |
老师讲解隐式转换:Go中虽然用
:=不用写类型,但底层是做了自动类型推导,而不是隐式转换。字符串不能自动转整型,整型不能自动变字符串或浮点型。
4.3 向后兼容
Go语言保证向后兼容:用之前版本Go编写的程序,可以在新版本的编译器上直接构建,不需要修改。
老师对比Java:Java 8写的东西不一定能在Java 17下运行,有些方法会打"废弃"警告。Go则不需要担心这个问题,可以放心下载最新版本。
五、Go的类型系统
5.1 类型安全的重要性
Go有足够的类型系统,以避免动态语言中粗心的类型错误。
老师讲故事:数据类型用错会导致严重事故,提到了波音飞机的事件,说明数据类型的重要性。
5.2 与Java的对比
Java中 int 可能就只是一个 int,而Go提供了更丰富的数据类型(有符号、无符号、不同位宽等),给程序员更多安全性和更好的运行时性能。
5.3 简洁但不简单
Go虽然简洁,但程序员不需要像C/C++那样手动管理太多底层细节。Go的类型系统给程序员带来了更多的安全性和更好的运行时性能。
六、Go的并发支持
6.1 并行的现代计算机
以前的计算机只能一个一个执行任务(单核),现代计算机都是并行机器(多核)。
6.2 CSP并发模型
Go提供了基于 CSP(Communicating Sequential Processes) 的并发侧应支持。
6.3 协程(Goroutine)
Go的动态栈使得协程的初始栈可以更小,创建一个协程的代价很小,百万级的协程完全可以执行。
老师解释:协程简单理解就是进程之间的协作。Go的标准库也提供了很多并发工具。
七、本讲小结
| 知识点 | 要点 |
|---|---|
| Go定位 | 21世纪的C语言,专注服务端高并发 |
| 继承自C | 表达式语法、控制结构、数据类型、指针、编译效率 |
| 垃圾回收 | 自动管理内存 |
| 包系统 | 积木式构建程序 |
| 函数一等公民 | 函数是最基本单元 |
| 无隐式转换 | 类型必须显式转换 |
| 向后兼容 | 旧代码可在新版本直接编译 |
| CSP并发 | 基于CSP模型的goroutine,百万级并发 |
| 类型安全 | 丰富数据类型避免粗心错误 |
八、课后练习
- 阅读《Go语言圣经》第一章,了解Go的设计哲学
- 对比Go和Java在特性上的差异(构造函数、继承、异常等)
- 理解"函数作为一等公民"的含义
- 查阅CSP并发模型的基本概念