# Go基础概念

Go语言的历史和发展

Go语言的诞生

Go语言(也称为Golang)是由Google公司于2009年开源的编程语言,由Robert Griesemer、Rob Pike和Ken Thompson设计开发。Go语言的设计目标是解决大型软件开发中的复杂性问题。

发展历程

查看Go版本信息

go version

查看Go环境信息

go env

Go主要版本里程碑

  • 2009年:Go语言开源
  • 2012年:Go 1.0发布,保证向后兼容
  • 2015年:Go 1.5发布,自举实现
  • 2018年:Go 1.11发布,引入模块系统
  • 2020年:Go 1.14发布,性能大幅提升
  • 2021年:Go 1.17发布,泛型预览
  • 2022年:Go 1.18发布,正式支持泛型

Go语言特性

核心特性

  1. 简洁性 - 语法简单,易于学习
  2. 高效性 - 编译快速,运行高效
  3. 并发性 - 内置并发支持
  4. 安全性 - 内存安全,类型安全

创建第一个Go程序

package main

import "fmt"

func main() {
    fmt.Println("Hello, Go!")
}' > hello.go

运行Go程序

go run hello.go

编译Go程序

go build hello.go

语言设计哲学

简洁性示例

package main

import "fmt"

func main() {
    // Go语言的简洁性体现
    name := "Go"  // 类型推断
    fmt.Printf("Hello, %s!\n", name)
}
go run simple.go

并发性示例

package main

import (
    "fmt"
    "time"
)

func sayHello(name string) {
    for i := 0; i < 3; i++ {
        fmt.Printf("Hello, %s! (%d)\n", name, i+1)
        time.Sleep(100 * time.Millisecond)
    }
}

func main() {
    // 启动goroutine
    go sayHello("Alice")
    go sayHello("Bob")
    
    // 等待goroutine完成
    time.Sleep(500 * time.Millisecond)
    fmt.Println("Done!")
}
go run concurrent.go

编程范式

命令式编程

Go主要采用命令式编程范式,代码按顺序执行。

命令式编程示例

package main

import "fmt"

func main() {
    // 声明变量
    var sum int
    
    // 循环计算
    for i := 1; i <= 10; i++ {
        sum += i
    }
    
    // 输出结果
    fmt.Printf("Sum of 1 to 10: %d\n", sum)
}
go run imperative.go

函数式编程元素

Go支持一些函数式编程特性,如高阶函数。

高阶函数示例

package main

import "fmt"

// 高阶函数:接受函数作为参数
func apply(nums []int, fn func(int) int) []int {
    result := make([]int, len(nums))
    for i, num := range nums {
        result[i] = fn(num)
    }
    return result
}

// 平方函数
func square(x int) int {
    return x * x
}

func main() {
    numbers := []int{1, 2, 3, 4, 5}
    squared := apply(numbers, square)
    
    fmt.Printf("Original: %v\n", numbers)
    fmt.Printf("Squared:  %v\n", squared)
}
go run functional.go

内存管理

垃圾回收

Go具有自动垃圾回收机制,无需手动管理内存。

查看垃圾回收统计

package main

import (
    "fmt"
    "runtime"
)

func main() {
    var m runtime.MemStats
    
    // 读取内存统计
    runtime.ReadMemStats(&m)
    
    fmt.Printf("分配的内存: %d KB\n", m.Alloc/1024)
    fmt.Printf("总分配内存: %d KB\n", m.TotalAlloc/1024)
    fmt.Printf("系统内存: %d KB\n", m.Sys/1024)
    fmt.Printf("GC次数: %d\n", m.NumGC)
}
go run memory.go

手动触发垃圾回收

package main

import (
    "fmt"
    "runtime"
)

func main() {
    // 创建一些数据
    data := make([][]int, 1000)
    for i := range data {
        data[i] = make([]int, 1000)
    }
    
    var m1, m2 runtime.MemStats
    runtime.ReadMemStats(&m1)
    fmt.Printf("GC前内存: %d KB\n", m1.Alloc/1024)
    
    // 手动触发GC
    runtime.GC()
    
    runtime.ReadMemStats(&m2)
    fmt.Printf("GC后内存: %d KB\n", m2.Alloc/1024)
}
go run gc.go

类型系统

静态类型

Go是静态类型语言,类型在编译时确定。

类型检查示例

package main

import "fmt"

func main() {
    // 显式类型声明
    var age int = 25
    var name string = "Alice"
    var isStudent bool = true
    
    // 类型推断
    height := 1.75  // float64
    count := 10     // int
    
    fmt.Printf("Age: %d (type: %T)\n", age, age)
    fmt.Printf("Name: %s (type: %T)\n", name, name)
    fmt.Printf("IsStudent: %t (type: %T)\n", isStudent, isStudent)
    fmt.Printf("Height: %.2f (type: %T)\n", height, height)
    fmt.Printf("Count: %d (type: %T)\n", count, count)
}
go run types.go

接口系统

Go的接口是隐式实现的,提供了强大的抽象能力。

接口示例

package main

import "fmt"

// 定义接口
type Speaker interface {
    Speak() string
}

// 定义结构体
type Dog struct {
    Name string
}

type Cat struct {
    Name string
}

// 实现接口(隐式)
func (d Dog) Speak() string {
    return d.Name + " says Woof!"
}

func (c Cat) Speak() string {
    return c.Name + " says Meow!"
}

// 使用接口
func makeSound(s Speaker) {
    fmt.Println(s.Speak())
}

func main() {
    dog := Dog{Name: "Buddy"}
    cat := Cat{Name: "Whiskers"}
    
    makeSound(dog)
    makeSound(cat)
}
go run interface.go

工具链

Go命令行工具

Go提供了丰富的命令行工具来支持开发。

查看Go工具帮助

go help

格式化代码

echo 'package main
import"fmt"
func main(){fmt.Println("Hello")}' > unformatted.go
go fmt unformatted.go
cat unformatted.go

检查代码

go vet hello.go

下载依赖

go mod download

性能分析

基准测试示例

echo 'package main

import (
    "testing"
    "strings"
)

func BenchmarkStringConcat(b *testing.B) {
    for i := 0; i < b.N; i++ {
        var result string
        for j := 0; j < 100; j++ {
            result += "hello"
        }
    }
}

func BenchmarkStringBuilder(b *testing.B) {
    for i := 0; i < b.N; i++ {
        var builder strings.Builder
        for j := 0; j < 100; j++ {
            builder.WriteString("hello")
        }
        _ = builder.String()
    }
}' > benchmark_test.go

运行基准测试

go test -bench=.

生态系统

标准库

Go拥有丰富的标准库,覆盖了大部分常用功能。

查看标准库文档

go doc fmt.Println

HTTP服务器示例

echo 'package main

import (
    "fmt"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, Go Web Server!")
}

func main() {
    http.HandleFunc("/", handler)
    fmt.Println("Server starting on :8080")
    http.ListenAndServe(":8080", nil)
}' > webserver.go

第三方包

搜索Go包

echo "Visit https://pkg.go.dev to search for Go packages"

添加依赖示例

go mod init example
go get github.com/gorilla/mux

应用领域

云原生开发

Go在云原生领域应用广泛,如Docker、Kubernetes等。

容器化应用示例

echo 'FROM golang:1.19-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o main .

FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/main .
CMD ["./main"]' > Dockerfile

微服务开发

简单微服务示例

echo 'package main

import (
    "encoding/json"
    "net/http"
    "log"
)

type Response struct {
    Message string `json:"message"`
    Status  string `json:"status"`
}

func healthHandler(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    response := Response{
        Message: "Service is healthy",
        Status:  "OK",
    }
    json.NewEncoder(w).Encode(response)
}

func main() {
    http.HandleFunc("/health", healthHandler)
    log.Println("Microservice starting on :8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}' > microservice.go

命令行工具

CLI工具示例

echo 'package main

import (
    "flag"
    "fmt"
    "os"
)

func main() {
    var name = flag.String("name", "World", "Name to greet")
    var count = flag.Int("count", 1, "Number of greetings")
    
    flag.Parse()
    
    if *count <= 0 {
        fmt.Println("Count must be positive")
        os.Exit(1)
    }
    
    for i := 0; i < *count; i++ {
        fmt.Printf("Hello, %s! (%d/%d)\n", *name, i+1, *count)
    }
}' > cli.go

运行CLI工具

go run cli.go -name="Go" -count=3

学习资源

官方资源

查看Go官方教程

echo "Visit https://tour.golang.org for interactive Go tutorial"

查看Go语言规范

echo "Visit https://golang.org/ref/spec for Go language specification"

实践建议

  1. 从小项目开始:先写简单的命令行工具
  2. 阅读标准库源码:学习最佳实践
  3. 参与开源项目:提升实战经验
  4. 关注Go博客:了解最新发展

创建学习项目

mkdir go-learning
cd go-learning
go mod init go-learning
echo 'package main

import "fmt"

func main() {
    fmt.Println("开始Go语言学习之旅!")
}' > main.go
go run main.go

恭喜!你已经了解了Go语言的基础概念。接下来让我们学习如何搭建Go开发环境。