以下是 Go 语言主要语法要点的汇总,并附上代码示例:
一、包与导入
每个 Go 程序都是由包组成的。
- 使用 package 关键字声明包名。
package main
- 通过 import 语句导入其他包以使用其中的功能。
import "fmt"
二、变量与常量
1. 变量声明: var name type = value 。可使用简短变量声明 name := value (需在函数内部且能推断出类型)。
var age int = 30
name := "John"
2. 常量声明: const name type = value 。
const pi float64 = 3.14159
三、数据类型
1. 基本数据类型:
- 整数类型(如 int 、 uint 、 int8 等)。
var num int = 100
var smallInt int8 = 5
- 浮点数类型(如 float32 、 float64 )。
var f1 float32 = 3.14
var f2 float64 = 6.28
- 布尔类型( bool ),值为 true 或 false 。
var isTrue bool = true
- 字符串类型( string )。
var str string = "Hello"
2. 复合数据类型:
- 数组: var arr [n]type ,具有固定长度。
var arr [5]int
- 切片:动态数组,可使用 make 创建或通过字面量初始化,如 s := []int{1, 2, 3} 。
s := make([]int, 0)
s2 := []int{4, 5, 6}
- 映射(字典): m := make(map[keyType]valueType) 。
m := make(map[string]int)
- 结构体:自定义数据类型,使用 type structName struct { field1 type1; field2 type2 } 定义。
type Person struct {
Name string
Age int
}
四、控制结构
1. 条件语句:
- if 、 else if 、 else 。
num := 10
if num > 5 {
fmt.Println("Number is greater than 5")
} else if num < 5 {
fmt.Println("Number is less than 5")
} else {
fmt.Println("Number is 5")
}
- 可以在 if 语句中进行简短变量声明。
if n := 20; n%2 == 0 {
fmt.Println("Number is even")
}
2. 循环语句:
- for 循环,有多种形式,如基本的 for init; condition; post {} 、 for condition {} 、 for {} (无限循环)。
for i := 0; i < 5; i++ {
fmt.Println(i)
}
j := 0
for j < 3 {
fmt.Println(j)
j++
}
for {
fmt.Println("Infinite loop")
break
}
- range 关键字可用于遍历数组、切片、映射等。
arr := []int{1, 2, 3}
for index, value := range arr {
fmt.Println(index, value)
}
m := map[string]int{"apple": 5, "banana": 3}
for key, value := range m {
fmt.Println(key, value)
}
3. 选择语句:
- switch 、 case ,可以对多种条件进行判断。
day := "Monday"
switch day {
case "Monday":
fmt.Println("It's Monday")
case "Tuesday":
fmt.Println("It's Tuesday")
default:
fmt.Println("Other day")
}
五、函数
- 使用 func 关键字定义函数,如 func functionName(parameters) returnTypes {} 。
go 复制
func add(a, b int) int {
return a + b
}
- 支持多返回值。
func divide(a, b int) (int, bool) {
if b == 0 {
return 0, false
}
return a / b, true
}
- 函数可以作为参数传递给其他函数,也可以从函数中返回函数。
func apply(f func(int) int, n int) int {
return f(n)
}
func double(n int) int {
return n * 2
}
func main() {
fmt.Println(apply(double, 5))
}
六、指针
- 可以使用 & 取变量的地址,使用 * 解引用指针。
num := 10
ptr := &num
fmt.Println(*ptr) // Output: 10
- 通过指针可以修改指向的值。
func changeValue(ptr *int) {
*ptr = 20
}
num := 10
changeValue(&num)
fmt.Println(num) // Output: 20
七、结构体与方法
- 定义结构体来组织数据。
type Person struct {
Name string
Age int
}
- 可以为结构体定义方法,使用 func (receiverName structName) methodName(parameters) returnTypes {} 。
func (p Person) sayHello() {
fmt.Println("Hello, I am", p.Name)
}
func main() {
p := Person{"John", 30}
p.sayHello()
}
八、接口
- 接口定义了一组方法签名。
type Shape interface {
Area() float64
}
- 任何实现了接口中所有方法的类型都被称为实现了该接口。
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return 3.14 * c.Radius * c.Radius
}
- 接口实现是隐式的。
九、并发编程
1. 协程(goroutine):
- 使用 go 关键字启动一个协程,如 go functionName() 。
func printNumbers() {
for i := 0; i < 5; i++ {
fmt.Println(i)
}
}
func main() {
go printNumbers()
for i := 5; i < 10; i++ {
fmt.Println(i)
}
}
2. 通道(channel):
- 可以使用 make 创建通道,如 ch := make(chan type) 。
ch := make(chan int)
- 支持发送 ch <- value 和接收 value := <-ch 操作。
func send(ch chan<- int) {
ch <- 42
}
func receive(ch <-chan int) {
value := <-ch
fmt.Println(value)
}
func main() {
ch := make(chan int)
go send(ch)
receive(ch)
}
十、错误处理
- 函数可以返回一个结果值和一个错误类型的值。
func divide(a, b int) (int, error) {
if b == 0 {
return 0, fmt.Errorf("division by zero")
}
return a / b, nil
}
- 调用者需要显式地检查错误并进行处理。
func main() {
result, err := divide(10, 0)
if err!= nil {
fmt.Println(err)
} else {
fmt.Println(result)
}
}