Go 语言入门指南:基础语法和常用特性解析
Go 语言(Golang)是一种开源编程语言,由 Google 开发。它因其简单、并发性强和高效等特点,广受开发者欢迎。本文将介绍 Go 语言的基础语法和常用特性,并对每段代码进行详细解释。
一、Go 语言的基本特性
- 静态类型和编译型语言:Go 是静态类型的编译型语言,这意味着在编译时会进行类型检查,编译后生成二进制可执行文件。
- 简洁的语法:Go 的语法简洁,强调代码的可读性,减少了不必要的符号和复杂结构。
- 内置并发支持:Go 提供了 goroutine 和 channel 来实现并发编程,简化了多线程开发的复杂度。
- 自动垃圾回收:Go 语言内置垃圾回收机制,开发者不需要手动管理内存。
二、Go 程序的基本结构
一个简单的 Go 程序示例如下:
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
代码解释:
package main:每个 Go 程序都必须有一个main包,它是程序的入口。import "fmt":导入标准库fmt包,用于格式化输出。func main():定义main函数,这是程序的起点。fmt.Println("Hello, World!"):调用fmt包中的Println函数输出字符串 "Hello, World!"。
三、变量和常量
Go 语言使用 var 关键字声明变量,const 声明常量。示例如下:
package main
import "fmt"
func main() {
var a int = 10 // 声明变量 a,类型为 int,值为 10
var b = 20 // 声明变量 b,类型自动推断为 int
c := 30 // 使用简短声明方式声明变量 c
const pi = 3.14 // 声明常量 pi,值为 3.14
fmt.Println(a, b, c, pi)
}
代码解释:
var a int = 10:声明了一个类型为int的变量a并赋值为 10。var b = 20:声明变量b,Go 会自动推断b的类型为int。c := 30:使用:=进行简短声明,省略了var关键字。const pi = 3.14:声明了一个常量pi,在程序中不可更改其值。
四、数据类型
Go 提供了多种数据类型,常见的有:
- 基本类型:
int、float64、string、bool - 复合类型:
array、slice、map、struct
示例:
package main
import "fmt"
func main() {
var str string = "Go语言"
var num int = 42
var isTrue bool = true
arr := [3]int{1, 2, 3} // 数组
slice := []int{4, 5, 6, 7} // 切片
myMap := map[string]int{"a": 1, "b": 2} // 映射
fmt.Println(str, num, isTrue)
fmt.Println(arr)
fmt.Println(slice)
fmt.Println(myMap)
}
代码解释:
var str string = "Go语言":声明一个string类型变量str,值为 "Go语言"。arr := [3]int{1, 2, 3}:声明一个长度为 3 的整型数组。slice := []int{4, 5, 6, 7}:声明一个切片,类似动态数组。myMap := map[string]int{"a": 1, "b": 2}:声明一个映射,键类型为string,值类型为int。
五、控制结构
Go 支持常见的控制结构,如 if-else、for 循环和 switch 语句。
if-else 示例:
package main
import "fmt"
func main() {
num := 10
if num > 5 {
fmt.Println("num 大于 5")
} else {
fmt.Println("num 小于或等于 5")
}
}
代码解释:
if num > 5:如果num大于 5,执行fmt.Println("num 大于 5")。else块在条件为false时执行。
for 循环示例:
package main
import "fmt"
func main() {
for i := 0; i < 5; i++ {
fmt.Println("i:", i)
}
}
代码解释:
for i := 0; i < 5; i++:for循环,从 0 迭代到 4。
switch 示例:
package main
import "fmt"
func main() {
day := "Monday"
switch day {
case "Monday":
fmt.Println("今天是星期一")
case "Tuesday":
fmt.Println("今天是星期二")
default:
fmt.Println("其他天")
}
}
代码解释:
switch day:根据day的值选择要执行的case分支。default:当没有匹配的case时执行。
六、函数
Go 中函数使用 func 关键字定义,支持多返回值。
示例:
package main
import "fmt"
func add(a int, b int) int {
return a + b
}
func swap(x, y string) (string, string) {
return y, x
}
func main() {
sum := add(3, 4)
fmt.Println("Sum:", sum)
a, b := swap("hello", "world")
fmt.Println("Swapped:", a, b)
}
代码解释:
func add(a int, b int) int:定义了一个返回int类型的函数add。func swap(x, y string) (string, string):定义了一个返回两个string值的函数swap。
七、指针
Go 支持指针,用于指向变量的内存地址。
示例:
package main
import "fmt"
func main() {
x := 10
p := &x // p 是指向 x 的指针
fmt.Println("x 的值:", x)
fmt.Println("p 指向的值:", *p)
*p = 20 // 通过指针修改 x 的值
fmt.Println("修改后的 x 的值:", x)
}
代码解释:
p := &x:p存储了变量x的地址。*p = 20:通过指针p修改x的值为 20。
八、goroutine 和并发
Go 使用 goroutine 实现轻量级并发。
示例:
package main
import (
"fmt"
"time"
)
func sayHello() {
for i := 0; i < 5; i++ {
fmt.Println("Hello")
time.Sleep(100 * time.Millisecond)
}
}
func main() {
go sayHello() // 启动 goroutine