GO

Go语言学习笔记。

学习资源:

go 官网学习

A Tour of Go

菜鸟教程

Go by example

Outline

Basics

基础语法

  • 程序结构
    1
    2
    3
    4
    5
    package main  // 包声明 - 每个Go程序都必须有一个main包
    import "fmt" // 导入包
    func main() {
    fmt.Println("Hello, World!")
    }
  • 变量声明

    • var a int = 10, 类型后置
    • 短声明:b := "hello", 无需类型声明,在函数内使用
    • 常量:const pi = 3.14
  • 数据类型

    • 基本类型:int, float64, bool, string
    • 派生类型:指针、数组、结构体、切片、Map、通道

包管理

  • 模块初始化
    go mod init <module-name>
  • 导入包
    1
    2
    3
    4
    import (
    "fmt"
    "math/rand"
    )
  • 包的导出名字母大写表示导出(public),小写表示私有(private)
  • 包是Go的基本组织单位,类似于其他语言的库或模块,一个包 = 一个目录下所有的.go文件

流程控制

条件语句

1
2
3
4
5
if x > 0 {
// ...
} else {
// ...
}

循环

1
2
3
4
5
6
7
8
for i := 0; i < 5; i++ {
// ...
}

// while等效
for x < 100 {
// ...
}

Switch

1
2
3
4
5
6
switch day {
case "Mon":
fmt.Println("周一")
default:
fmt.Println("其他")
}

相当于自动添加break,可以使用 fallthrough 继续执行下一个 case。


数据结构

数组与切片

1
2
3
4
5
6
// 数组(固定长度)
arr := [3]int{1, 2, 3}

// 切片(动态数组)
slice := []int{1, 2}
slice = append(slice, 3) // 添加元素

Map

1
2
3
m := make(map[string]int)
m["age"] = 25
delete(m, "age") // 删除键

结构体

1
2
3
4
5
type Person struct {
Name string
Age int
}
p := Person{Name: "Tom", Age: 30}

Methods and Interfaces

函数

1
2
3
4
5
6
7
8
func add(a, b int) int {
return a + b
}

// 多返回值
func swap(x, y string) (string, string) {
return y, x
}

方法(接收者)

1
2
3
4
5
type Circle struct { Radius float64 }

func (c Circle) Area() float64 {
return 3.14 * c.Radius * c.Radius
}

接口

1
2
3
4
5
6
7
type Shape interface {
Area() float64
}

func printArea(s Shape) {
fmt.Println(s.Area())
}

Concurrency

Goroutine 和 Channel

1
2
3
4
5
6
7
8
9
// Goroutine
go func() {
fmt.Println("并发执行")
}()

// Channel
ch := make(chan int)
go func() { ch <- 1 }() // 发送
value := <-ch // 接收

Select

1
2
3
4
5
6
select {
case msg1 := <-ch1:
fmt.Println(msg1)
case ch2 <- "hi":
// 发送成功
}

错误处理

1
2
3
4
5
result, err := someFunction()
if err != nil {
log.Fatal(err)
}
defer file.Close() // 确保资源释放