简单记录一下参加青训营学习Go语言的一个过程,本篇仅介绍一些基础语法和一些常用特性
Go语言的优点
Go是一个特别适合构建高效、简单且具有并发能力的语言,特别是在计算和服务端开发具有非常好的性能,而且相对于java和c++来说,go语言语法较为简洁,还通过静态类型检测避免了很多潜在的错误,此外Go原生支持并发,适合现代的多核处理器
Go语言基础语法
- 输出Hello World
我们在学习每一个编程语言的时候,第一步肯定是学会怎么使用这个语言输出“Hello World!”,以下是Go语言的输出“Hello World!”的代码:
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
在Go语言中,每一个程序都需要一个main包,并且main函数是程序的入口点,这点与c++类似,Go没有明显的构造函数,Go的函数设计简洁。
- 变量与常量
Go语言有明确的静态类型系统,变量定义可以使用var关键字,也可以通过 :=符号直接赋值
var a int = 10
b := "hello"
const PI = 3.14159
:=是Go语言短声明方式,适用于局部变量的定义。Go语言是一种静态语言,因此在定义变量的时候就需要声明类型。Go的变量定义虽然简单,但是对变量的命名、类型等有严格要求。在学习GO语言的过程中,我们要逐步适应这种约束,这也是Go语言的优势之一。
- 函数
函数是编程的核心,在Go语言中,函数的定义和调用也非常简介,并且支持多返回值:
func add(a int, b int) (int, int) {
sum := a + b
diff := a - b
return sum, diff
}
func main() {
result, difference := add(3, 2)
fmt.Println("Sum:", result, "Difference:", difference)
}
以上就定义了一个可以返回两数相加和两数相减的结果的函数。多返回值是Go语言的一大特点,简化了错误处理和多项数据返回的场景。设计多返回值的初衷之一就是减少异常处理的繁琐代码。
4.控制结构
Go语言中if、for、switch是最常用的控制语句,但是Go语言中没有while,因为所有需要while实现的功能,for都可以实现:
package main
import "fmt"
func main() {
for i := 1; i <= 5; i++ {
if i%2 == 0 {
fmt.Println(i, "是偶数")
} else {
fmt.Println(i, "是奇数")
}
}
以上就是一个for循环的基本语法,在Go语言中,for的使用非常灵活,不仅可以用于传统的循环控制,还可以直接遍历数组、切片、映射等,Go语言的switch语句比其他语言的更加强大,它支持任何类型的表达式,并且可以自动进行断行而不需要break:
grade := "B"
switch grade {
case "A":
fmt.Println("优秀")
case "B":
fmt.Println("良好")
case "C":
fmt.Println("合格")
case "D":
fmt.Println("不及格")
default:
fmt.Println("未知等级")
}
在Go语言中,鼓励使用for作为唯一的循环结构,这种设计让代码风格更加统一,减少了“使用何种循环结构”的选择成本。
5.数据结构:数组、切片和映射
在Go语言中,数组、切片和映射是非常重要的数据结构,特别是切片(slice),是Go语言的核心结构之一。
func main() {
nums := []int{1, 2, 3, 4}
fmt.Println("Slice:", nums)
}
切片是基于数组的动态结构,长度可以变化,且内存分配上更加灵活。而映射(map)是一种键值对数据结构,用于快速查找和检索:
func main() {
ages := map[string]int{"Alice": 25, "Bob": 30}
fmt.Println("Alice's age:", ages["Alice"])
}
切片和映射的设计让Go语言更加适应数据变化的应用场景。在学习过程中我们要注意切片的底层实现方法,这样可以避免不必要的内存消耗,提高程序性能。
6.并发处理 Goroutine和Channel
Go语言的并发能力是其亮点之一。Goroutine是Go中的轻量级线程,由Go的运行时管理,配合Channel,可以实现高效的并发处理:
func sayHello() {
fmt.Println("Hello, Go!")
}
func main() {
go sayHello() // 启动一个新的 goroutine
fmt.Println("Hello, Main!")
}
在以上代码中,go sayHello()启动了一个新的Goroutine,Goroutine的设计理念是以最小代价实现并发,因此我们可以启动成千上万的Goroutine,而且不必担心过多的系统开销。
Channel是Go语言用来在Goroutine之间传递数据的通信机制,它使并发编程更加简单且安全:
func main() {
messages := make(chan string)
go func() { messages <- "ping" }()
msg := <-messages
fmt.Println(msg)
}
Channel提供了一种队列式的通信方式 ,避免了传统并发编程中的共享内存问题,通过Channel,可以轻松实现Goroutine之间的数据同步。Goroutine 和 Channel 让 Go 的并发编程更加易学易用,避免了繁琐的锁和信号量问题。通过这种结构化的并发模型,使得多线程编程变得更清晰,代码更具可读性。
总结
在学习了Go语言的基础语法之后,最大的感受就是Go语言的简洁与高效,Go通过精简的语法和清晰的设计降低了编程的复杂度,在学习Go语言的过程中要坚持写简洁代码以及时刻保持并发思维,这是提高编程水平的重要方法。