闷骚熊猫

导航

go语言基础知识

一、Go语言简介

  1. 诞生背景
  • 由Google工程师Robert Griesemer、Rob Pike和Ken Thompson于2007年设计
  • 2009年正式发布,2024年最新版本为Go 1.22
  • 设计目标:解决大规模系统开发中的编译速度、依赖管理和并发处理问题
  1. 核心特性
  • 编译型语言(编译为机器码)
  • 静态类型检查
  • 垃圾回收机制(GC)
  • 原生并发支持(goroutine + channel)
  • 简洁的语法(约25个关键字)
  • 跨平台编译能力
  • 内置强大标准库

二、基础语法结构

go
1// Hello World示例
2package main
3
4import "fmt"
5
6func main() {
7    fmt.Println("Hello, 世界!")
8}

三、核心编程要素

  1. 变量与常量
go
1var name string = "Go"      // 显式声明
2age := 10                   // 类型推断(短声明)
3const PI = 3.14             // 常量
  1. 数据类型
  • 基本类型:boolstringint系列, float32/64complex64/128
  • 复合类型:arrayslicemapstructpointerchannelfunc
  • 特色类型:
    • slice(动态数组):make([]int, 5)
    • map(字典):m := make(map[string]int)
  1. 函数特性
go
1// 多返回值、命名返回值
2func calc(a, b int) (sum int, diff int) {
3    sum = a + b
4    diff = a - b
5    return  // 自动返回命名返回值
6}
  1. 流程控制
go
1// if支持简短语句
2if x := getValue(); x > 0 {
3    // ...
4}
5
6// for循环(无while)
7for i := 0; i < 10; i++ { /*...*/ }
8
9// switch(无需break)
10switch os := runtime.GOOS; os {
11case "darwin":
12    fmt.Println("macOS")
13default:
14    fmt.Println(os)
15}

四、面向对象特性

  1. 结构体与方法
go
1type User struct {
2    Name string
3    Age  int
4}
5
6// 方法定义(值接收者)
7func (u User) SayHello() {
8    fmt.Printf("Hi, I'm %s", u.Name)
9}
10
11// 指针接收者(可修改结构体)
12func (u *User) UpdateAge(newAge int) {
13    u.Age = newAge
14}
  1. 接口(隐式实现)
go
1type Writer interface {
2    Write([]byte) (int, error)
3}
4
5type FileWriter struct{}
6
7func (fw FileWriter) Write(data []byte) (int, error) {
8    // 实现接口...
9}

五、并发编程

  1. goroutine
go
1go func() {
2    fmt.Println("异步执行")
3}()
  1. channel
go
1ch := make(chan int, 3)  // 缓冲通道
2ch <- 42                 // 发送
3val := <-ch              // 接收
4
5// 通道同步示例
6func worker(ch chan<- int) {
7    ch <- 1
8}
9
10func main() {
11    ch := make(chan int)
12    go worker(ch)
13    <-ch
14}

六、错误处理

go
1// 典型错误处理模式
2result, err := SomeOperation()
3if err != nil {
4    // 处理错误
5}
6
7// defer机制
8func readFile() {
9    file, err := os.Open("test.txt")
10    if err != nil { /*...*/ }
11    defer file.Close()  // 确保资源释放
12    // 处理文件...
13}

七、包管理

  1. Go Modules
bash
1go mod init example.com/project  # 初始化模块
2go get github.com/pkg/errors     # 添加依赖
  1. 常用标准库
  • fmt: 格式化I/O
  • io: 基础IO操作
  • net/http: HTTP协议支持
  • os: 操作系统交互
  • sync: 并发同步

八、实战示例

并发HTTP请求

go
1func fetch(url string, ch chan<- string) {
2    resp, err := http.Get(url)
3    if err != nil {
4        ch <- fmt.Sprint(err)
5        return
6    }
7    defer resp.Body.Close()
8    ch <- fmt.Sprintf("%s -> %d", url, resp.StatusCode)
9}
10
11func main() {
12    urls := []string{"https://go.dev", "https://google.com"}
13    ch := make(chan string)
14    
15    for _, url := range urls {
16        go fetch(url, ch)
17    }
18    
19    for range urls {
20        fmt.Println(<-ch)
21    }
22}
 

posted on 2025-03-20 15:04  闷骚熊猫  阅读(72)  评论(0)    收藏  举报