1.Go的起源
Go语言的设计始于2007年底,当时Google的三位工程师Robert Griesemer、Rob Pike和Ken Thompson开始讨论并设计一种新的编程语言,旨在解决Google内部遇到的一些编程问题,尤其是多核处理器、网络系统和大型代码库的管理问题。Go语言因其简洁、高效和强大的并发支持,在云计算、微服务、网络编程等领域得到了广泛应用,未来发展前景广阔。
2.Go语言的优点
1. 简洁性和易学性
- 语法简洁:Go语言的语法非常简洁,类似于C语言,但更加简化。它去掉了很多不必要的符号和特性,使得代码更加清晰易读。
- 易于学习:Go语言只有25个关键字,且语言特性相对较少,开发者可以快速上手。对于有其他编程语言经验的开发者来说,学习曲线较为平缓。
2. 高效的编译和执行
- 快速编译:Go语言的编译速度非常快,这得益于其设计上的简洁和自举编译器的优化。开发者可以快速编译和运行程序,提高开发效率。
- 高性能:Go语言的运行时性能非常接近C/C++,特别是在网络服务和高并发场景下,Go的表现尤为出色。
3. 强大的并发支持
- Goroutines:Go语言原生支持并发编程,通过Goroutines可以非常轻松地创建轻量级线程。Goroutines的创建和销毁成本非常低,可以轻松启动成千上万个Goroutines。
- Channel:Go语言通过Channel实现了Goroutines之间的通信,使得并发编程更加安全和简单。Channel是一种线程安全的通信机制,可以避免传统多线程编程中的锁和条件变量等问题。
4. 内存管理
- 垃圾回收:Go语言自带垃圾回收机制,开发者无需手动管理内存,减少了内存泄漏的风险。Go的垃圾回收器经过多个版本的优化,性能和延迟已经非常优秀。
- 内存分配:Go语言的内存分配机制非常高效,特别是在高并发场景下,内存分配和回收的性能表现尤为出色。
5. 跨平台支持
- 编译型语言:Go语言是编译型语言,可以直接编译成机器码,生成独立的可执行文件。这使得Go语言可以轻松跨平台部署,无需依赖额外的运行时环境。
- 多平台支持:Go语言支持多种操作系统和硬件平台,包括Linux、macOS、Windows、ARM等。
6. 强大的标准库
- 丰富的标准库:Go语言的标准库非常丰富,涵盖了网络、文件I/O、文本处理、图像处理等多个领域。标准库的质量和稳定性都非常高,可以大大简化开发者的工作。
- 易于扩展:Go语言的标准库和第三方库都非常容易使用和扩展,开发者可以快速构建自己的工具和应用。
7. 静态类型系统
- 类型安全:Go语言是静态类型语言,编译时进行类型检查,可以有效避免类型错误。
- 类型推导:Go语言支持类型推导,开发者可以在声明变量时省略类型,编译器会根据上下文自动推导出类型。
8. 开源和社区支持
- 开源项目:Go语言是开源项目,由Google发起并维护,社区贡献者众多。开源社区非常活跃,不断推动Go语言的发展和改进。
- 丰富的第三方库:Go语言的生态系统非常丰富,有大量的第三方库和工具可供使用,涵盖了Web开发、数据库操作、分布式系统等多个领域。
9. 部署简单
- 单一可执行文件:Go语言编译后的程序是一个单一的可执行文件,无需依赖其他库和环境,部署非常简单。
- 容器化支持:Go语言的单一可执行文件特性非常适合容器化部署,可以轻松构建Docker镜像,实现微服务架构下的快速部署和扩展。
10. 广泛的应用场景
- 云计算和微服务:Go语言在云计算和微服务领域得到了广泛应用,如Kubernetes、Docker等项目都是使用Go语言开发的。
- 网络编程:Go语言在网络编程和高并发场景下表现尤为出色,如Web服务器、分布式系统、实时通信等。
3.Go的学习方向
- 区块链研发工程师
- GO服务器端/游戏软件工程师
- 分布式/云计算/软件工程师
应用领域
- 区块链应用
- 后端服务器的应用(计算能力强,高并发)
- 云计算/云服务后台应用
4.学习方法
- 高效而愉快的学习
- 先建立一个整体框架,然后细节
- 需要使用什么,现学
- 先how ,后 why
- 编程时一门 ”做中学“ 的学科,不是回了在做,而是做了才会
- 适当的囫囵吞枣,不会的先跳过。
- 学习软件编程是在琢磨别人怎么做,而不是我认为应该怎么做的过程
- 完成大于完美
如何快速深入学习一个新的技术或者一个知识点
- 我们有一个需求(页面局部刷新问题)
- 先看看使用现有的技术能否解决这个问题
- 学习一下新技术或者知识点的基本语法
- 快速入门,简单,了解,基本使用,不需要设计技术细节
- 讨论你这个新技术知识点的细节,怎么使用更规范,使用的细节,使用时需要注意什么...体现一个程序员水平
5.go的注意事项
- 严格区分大小写
- 语句结束不需要加;
- 一行一行写
- go语言定义的变量或者import的包如果没有使用到,代码编译不能通过
- 大括号成对出现,缺一不可
- 包声明,编写源文件时,必须在非注释的第一行指明这个文件属于哪个包,如
package main。 - 引入包,其实就是告诉Go 编译器这个程序需要使用的包,如
import "fmt"其实就是引入了fmt包。
6.数组
Go语言中数组的语法相对简单和直接。以下是关于Go语言数组的主要语法要点:
1. 数组声明
你可以使用以下语法来声明一个数组:
var 数组名 [长度]类型
例如:
var numbers [5]int
这声明了一个名为 numbers 的数组,包含5个 int 类型的元素。
2. 数组初始化
你可以在声明数组时对其进行初始化:
var 数组名 [长度]类型 = [长度]类型{值1, 值2, ..., 值N}
例如:
var numbers [5]int = [5]int{1, 2, 3, 4, 5}
你也可以省略长度,用 ... 来自动推断长度:
var numbers = [...]int{1, 2, 3, 4, 5}
3. 访问和修改数组元素
你可以使用索引来访问和修改数组中的元素:
数组名[索引]
例如:
numbers[0] = 10 // 修改第一个元素
fmt.Println(numbers[2]) // 访问第三个元素
4. 数组长度
你可以使用 len 函数来获取数组的长度:
len(数组名)
例如:
fmt.Println(len(numbers)) // 输出数组的长度
5. 遍历数组
你可以使用 for 循环遍历数组:
for i := 0; i < len(数组名); i++ {
fmt.Println(数组名[i])
}
或者使用 range 关键字:
for index, value := range 数组名 {
fmt.Printf("索引: %d, 值: %d\n", index, value)
}
示例代码
以下是一个完整的示例代码,展示了数组的声明、初始化、访问、修改和遍历:
package main
import "fmt"
func main() {
// 声明并初始化一个数组
var numbers [5]int = [5]int{1, 2, 3, 4, 5}
// 打印数组
fmt.Println("数组内容:", numbers)
// 访问数组中的元素
fmt.Println("第一个元素:", numbers[0])
fmt.Println("第三个元素:", numbers[2])
// 修改数组中的元素
numbers[1] = 10
fmt.Println("修改后的数组:", numbers)
// 获取数组的长度
fmt.Println("数组长度:", len(numbers))
// 遍历数组
for i := 0; i < len(numbers); i++ {
fmt.Printf("索引: %d, 值: %d\n", i, numbers[i])
}
// 使用 range 遍历数组
for index, value := range numbers {
fmt.Printf("索引: %d, 值: %d\n", index, value)
}
}
7.go循环
在Go语言中,for 循环是主要的循环结构,用于重复执行一段代码。Go只有一种循环语法,即 for 循环,但它可以实现多种不同的循环形式。以下是Go语言中 for 循环的主要语法和用法:
1. 基本的 for 循环
最常见的 for 循环形式如下:
for 初始化; 条件; 后操作 {
// 循环体
}
- 初始化:在循环开始前执行一次,通常用于初始化计数器。
- 条件:在每次循环迭代前进行判断,如果为
true,则继续执行循环体;如果为false,则退出循环。 - 后操作:在每次循环迭代后执行,通常用于更新计数器。
示例:
package main
import "fmt"
func main() {
for i := 0; i < 5; i++ {
fmt.Println(i)
}
}
输出:
0
1
2
3
4
2. 无限循环
你可以省略所有条件,使循环无限执行:
for {
// 无限循环
}
可以使用 break 语句来退出循环:
package main
import "fmt"
func main() {
i := 0
for {
fmt.Println(i)
i++
if i >= 5 {
break
}
}
}
输出:
0
1
2
3
4
3. 条件循环
你可以在 for 循环中只使用条件部分:
for 条件 {
// 循环体
}
这类似于其他语言中的 while 循环:
package main
import "fmt"
func main() {
i := 0
for i < 5 {
fmt.Println(i)
i++
}
}
输出:
0
1
2
3
4
4. for 循环与 range
你可以使用 range 关键字来遍历数组、切片、字符串、映射(map)和通道(channel):
for 索引, 值 := range 集合 {
// 循环体
}
示例:
package main
import "fmt"
func main() {
numbers := []int{1, 2, 3, 4, 5}
for index, value := range numbers {
fmt.Printf("索引: %d, 值: %d\n", index, value)
}
}
输出:
索引: 0, 值: 1
索引: 1, 值: 2
索引: 2, 值: 3
索引: 3, 值: 4
索引: 4, 值: 5
5. 跳过循环
你可以使用 continue 语句来跳过当前迭代并开始下一次迭代:
package main
import "fmt"
func main() {
for i := 0; i < 5; i++ {
if i == 2 {
continue
}
fmt.Println(i)
}
}
7.go的条件语句
Go 语言中的条件语句主要使用 if 和 switch 语句来实现。下面详细介绍这两种条件语句的语法和使用示例。
1. if 语句
Go 语言中的 if 语句用于根据条件执行不同的代码块。其基本语法如下:
if 条件 {
// 条件为 true 时执行的代码
}
示例:
package main
import "fmt"
func main() {
a := 10
if a > 5 {
fmt.Println("a 大于 5")
}
}
输出:
a 大于 5
if-else 语句
你可以使用 else 来处理条件为 false 的情况:
if 条件 {
// 条件为 true 时执行的代码
} else {
// 条件为 false 时执行的代码
}
示例:
package main
import "fmt"
func main() {
a := 3
if a > 5 {
fmt.Println("a 大于 5")
} else {
fmt.Println("a 小于或等于 5")
}
}
输出:
a 小于或等于 5
if-else if-else 语句
你可以使用多个条件来处理多种情况:
if 条件1 {
// 条件1为 true 时执行的代码
} else if 条件2 {
// 条件2为 true 时执行的代码
} else {
// 所有条件都为 false 时执行的代码
}
示例:
package main
import "fmt"
func main() {
a := 10
if a > 100 {
fmt.Println("a 大于 100")
} else if a > 10 {
fmt.Println("a 大于 10 但小于或等于 100")
} else {
fmt.Println("a 小于或等于 10")
}
}
输出:
a 小于或等于 10
if 语句中的变量作用域
在 Go 语言中,你可以在 if 语句前添加一个短变量声明,该变量的作用域仅限于 if 及其附属的 else 块。
if 短变量声明; 条件 {
// 使用短变量声明中的变量
}
示例:
package main
import "fmt"
func main() {
if a := 10; a > 5 {
fmt.Println("a 大于 5")
} else {
fmt.Println("a 小于或等于 5")
}
}
输出:
a 大于 5
2. switch 语句
Go 语言中的 switch 语句用于根据多个条件执行不同的代码块。其基本语法如下:
switch 表达式 {
case 值1:
// 表达式等于值1时执行的代码
case 值2:
// 表达式等于值2时执行的代码
default:
// 表达式不等于任何值时执行的代码
}
示例:
package main
import "fmt"
func main() {
a := 2
switch a {
case 1:
fmt.Println("a 等于 1")
case 2:
fmt.Println("a 等于 2")
default:
fmt.Println("a 不等于 1 或 2")
}
}
输出:
a 等于 2
switch 语句中的多个条件(续)
你可以在 case 中使用多个值,以处理多种情况:
switch 表达式 {
case 值1, 值2:
// 表达式等于值1或值2时执行的代码
default:
// 表达式不等于任何值时执行的代码
}
示例:
package main
import "fmt"
func main() {
a := 2
switch a {
case 1, 3, 5:
fmt.Println("a 是奇数")
case 2, 4, 6:
fmt.Println("a 是偶数")
default:
fmt.Println("a 不是1到6之间的数字")
}
}
输出:
a 是偶数
switch 语句中的 fallthrough
在 Go 语言中,switch 语句默认情况下在匹配到一个 case 后不会继续执行下一个 case,但如果需要继续执行下一个 case,可以使用 fallthrough 关键字:
switch 表达式 {
case 值1:
// 表达式等于值1时执行的代码
fallthrough
case 值2:
// 无论值2是否匹配,都会执行这段代码
}
示例:
package main
import "fmt"
func main() {
a := 2
switch a {
case 1:
fmt.Println("a 等于 1")
case 2:
fmt.Println("a 等于 2")
fallthrough
case 3:
fmt.Println("a 等于 3(通过 fallthrough)")
default:
fmt.Println("a 不是1到3之间的数字")
}
}
输出:
a 等于 2
a 等于 3(通过 fallthrough)
switch 语句中没有表达式
你还可以在 switch 语句中不使用任何表达式,这时它类似于一个 if-else 链:
switch {
case 条件1:
// 条件1为 true 时执行的代码
case 条件2:
// 条件2为 true 时执行的代码
default:
// 所有条件都为 false 时执行的代码
}
示例:
package main
import "fmt"
func main() {
a := 10
switch {
case a > 100:
fmt.Println("a 大于 100")
case a > 10:
fmt.Println("a 大于 10 但小于或等于 100")
default:
fmt.Println("a 小于或等于 10")
}
}