2025-04-10
编程
00

目录

1. 变量声明
2. 基本数据类型
3. 控制结构
条件语句
循环
4. 函数定义
5. 数组与切片
6. 映射(Map)
7. 结构体(Struct)
8. 接口(Interface)
9. 并发
10. 错误处理
11. 包管理
12. 指针
13. 方法
14. 接口与多态性
15. 嵌入类型
16. 延迟调用(Defer)
17. 闭包
18. 选择语句(Select)
19. 测试
20. 性能优化

Go语言(也称为Golang)是由Google开发的一种静态类型、编译型的编程语言,以其简洁性、高效的并发支持而著称。以下是Go语言的一些基础语法要点:

1. 变量声明

在Go中,变量可以通过var关键字声明,并且需要指定类型。也可以使用:=操作符进行简短声明。

  • 使用var声明:
go
var a int a = 42
  • 简短声明:
go
b := "hello"

2. 基本数据类型

Go支持多种基本数据类型,包括但不限于:

  • 整型:int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64
  • 浮点型:float32, float64
  • 布尔型:bool
  • 字符串:string
  • 复数:complex64, complex128

3. 控制结构

条件语句

go
if x > 0 { // 当x大于0时执行的代码 } else if x < 0 { // 当x小于0时执行的代码 } else { // 当x等于0时执行的代码 }

循环

  • for循环是Go中唯一的循环语句。
go
// 标准for循环 for i := 0; i < 5; i++ { fmt.Println(i) } // 无限循环 for { // 需要手动break退出循环 }

4. 函数定义

函数通过func关键字定义,可以有参数和返回值。

go
func add(a int, b int) int { return a + b } func main() { result := add(5, 7) fmt.Println(result) // 输出: 12 }

5. 数组与切片

  • 数组是一个固定大小的数据序列。
go
var arr [5]int arr[0] = 1
  • 切片是对数组的抽象,允许动态增加元素。
go
s := []int{1, 2, 3} s = append(s, 4) fmt.Println(s) // 输出: [1 2 3 4]

6. 映射(Map)

映射是一种无序键值对集合。

go
m := make(map[string]int) m["apple"] = 2 fmt.Println(m["apple"]) // 输出: 2

7. 结构体(Struct)

用于定义复杂的数据类型。

go
type Person struct { Name string Age int } func main() { p := Person{Name: "John", Age: 30} fmt.Println(p.Name) // 输出: John }

8. 接口(Interface)

接口定义了一组方法签名,任何实现了这些方法的类型都被认为实现了该接口。

go
type Speaker interface { Speak() string } type Dog struct{} func (d Dog) Speak() string { return "Woof!" } func main() { var s Speaker = Dog{} fmt.Println(s.Speak()) // 输出: Woof! }

9. 并发

Go通过goroutine和channel支持简单的并发模型。

  • 启动一个新的goroutine:
go
go func(x int) { fmt.Println("Goroutine:", x) }(1)
  • Channel用于goroutine之间的通信:
go
ch := make(chan int) go func() { ch <- 1 }() fmt.Println(<-ch) // 输出: 1

10. 错误处理

Go提倡显式错误处理而不是异常机制。

go
result, err := someFunction() if err != nil { log.Fatal(err) } fmt.Println(result)

11. 包管理

Go 使用模块(go.mod)进行依赖管理和版本控制。从 Go 1.11 开始,默认支持模块功能。

  • 初始化一个新的模块:
bash
go mod init example.com/myapp

这会在当前目录下创建一个 go.mod 文件,定义了模块路径和依赖项。

  • 添加依赖: 当你导入并使用第三方包时,运行 go get 命令来添加依赖。
bash
go get github.com/some/package
  • 更新依赖:
bash
go mod tidy

这个命令会清理未使用的依赖,并确保所有直接和间接依赖都是最新版本。

12. 指针

Go 支持指针,允许你直接操作内存地址,但不支持指针运算(如 C/C++ 中的指针加减)。

  • 获取变量的地址:
go
a := 42 p := &a // p 是指向 a 的指针
  • 解引用指针:
go
fmt.Println(*p) // 输出: 42

13. 方法

方法是一种带有接收者的函数,接收者可以是值类型或指针类型。

  • 定义方法:
go
type MyInt int func (m *MyInt) Add(n int) { *m += MyInt(n) } func main() { var m MyInt = 5 m.Add(3) fmt.Println(m) // 输出: 8 }

14. 接口与多态性

接口在 Go 中用于实现多态性。如果一个类型实现了接口的所有方法,则该类型被认为实现了此接口。

  • 实现多个接口:
go
type Speaker interface { Speak() string } type Mover interface { Move() string } type Dog struct{} func (d Dog) Speak() string { return "Woof!" } func (d Dog) Move() string { return "Running" } func main() { var s Speaker = Dog{} var m Mover = Dog{} fmt.Println(s.Speak()) // 输出: Woof! fmt.Println(m.Move()) // 输出: Running }

15. 嵌入类型

Go 支持通过匿名字段实现组合(Composition),这种方式常被称为“嵌入”。

  • 结构体嵌入:
go
type Animal struct { Name string } func (a *Animal) Eat() { fmt.Println(a.Name, "is eating") } type Dog struct { Animal // 嵌入 Animal } func main() { d := Dog{Animal{Name: "Buddy"}} d.Eat() // 输出: Buddy is eating }

16. 延迟调用(Defer)

defer 关键字用于安排一个函数调用在周围的函数返回之后执行。通常用于资源清理。

  • 示例:
go
func main() { defer fmt.Println("World") fmt.Println("Hello") } // 输出: // Hello // World

17. 闭包

闭包是一个函数值,它引用了其函数体内定义的变量。这些变量会被保存在闭包中,即使它们超出了原始作用域。

  • 示例:
go
func makeAdder() func(int) int { sum := 0 return func(x int) int { sum += x return sum } } func main() { adder := makeAdder() fmt.Println(adder(1)) // 输出: 1 fmt.Println(adder(2)) // 输出: 3 }

18. 选择语句(Select)

select 语句用于等待多个通信操作。它类似于 switch,但专门用于通道操作。

  • 示例:
go
ch1 := make(chan string) ch2 := make(chan string) go func() { time.Sleep(time.Second * 1) ch1 <- "one" }() go func() { time.Sleep(time.Second * 2) ch2 <- "two" }() for i := 0; i < 2; i++ { select { case msg1 := <-ch1: fmt.Println("Received", msg1) case msg2 := <-ch2: fmt.Println("Received", msg2) } } // 可能输出: // Received one // Received two

19. 测试

Go 提供了内置的测试框架。测试文件名应以 _test.go 结尾。

  • 编写测试:
go
package mypkg import "testing" func TestAdd(t *testing.T) { result := add(2, 3) if result != 5 { t.Errorf("Expected 5, got %d", result) } }
  • 运行测试:
bash
go test ./...

20. 性能优化

  • 避免不必要的内存分配。
  • 使用适当的同步机制(如互斥锁、读写锁)来保护共享数据。
  • 利用 Go 的垃圾回收机制,但也要注意避免过度分配导致频繁GC。

以上是对 Go 语言更全面的基础语法介绍。