前言:关于我,之前是前端开发工程师,最常用的语言是 React,最近乘着 AI 的东风转职全栈。本文目标是快速掌握 Go 语言关键知识 ,面向有一定编程基础,想快速了解 Go 的朋友,本文借鉴了Go 入门指南。
Go 语言特点:
Go 语言具有以下几个显著特点:
- 快速编译:编译速度媲美 Java。
- 高效执行:执行速度接近 C++。
- 易于开发:简洁的语法和强大的标准库使得开发效率很高。
Go 是一种编译型语言,通过 go build 命令编译成二进制可执行文件,这一点与 C/C++ 类似,Go 比 C++ 要慢 20%,比任何非静态和编译型语言快 2 到 10 倍。Go 语言非常适合作为服务端语言,但由于垃圾回收和自动内存分配的原因,不适合用来开发对实时性要求很高的软件。
(PS: Java 也是编译型语言,但需要在 Java 虚拟机 (JVM) 上运行。Python、Node.js 属于解释型语言,不需要编译,代码直接在解释器上执行。)
一、基本结构与流程控制。
Go 的「基本结构与流程控制」和 JavaScript 基本无异,只有一些小区别,例如
- let在 Go 中叫- var,定义变量时需要声明类型。
- switch语句中有个- fallthrough用于强制执行下一个 case 语句。
- 有一个 goto但不建议使用。
- Go 的数组(Array)是定长的,Go 切片(Slice)相当于 JavaScript 的数组。
- ......
示例代码:基本结构与流程控制
            
            
              go
              
              
            
          
          package main
import "fmt"
func main() {
    var x int = 5
    if x > 0 {
        fmt.Println("x is positive")
    }
    for i := 0; i < 5; i++ {
        fmt.Println(i)
    }
    switch x {
    case 1:
        fmt.Println("One")
    case 5:
        fmt.Println("Five")
    default:
        fmt.Println("Other")
    }
}二、面向对象
Go 语言虽然不支持传统的面向对象编程,但通过结构体和接口,实现了面向对象的编程思想。
结构体与方法
结构体类似于类,可以包含多个字段。方法是绑定到特定类型(包括结构体)的函数。
示例代码:结构体与方法
            
            
              go
              
              
            
          
          package main
import "fmt"
type Rect struct {
    width, height int
}
func (r Rect) area() int {
    return r.width * r.height
}
func main() {
    r := Rect{width: 10, height: 5}
    fmt.Println("Area:", r.area())
}接口与反射
接口是一组方法签名的集合,任何实现了这些方法的类型都隐式地实现了该接口。反射是 Go 语言的一大特色,可以在运行时检查类型。
示例代码:接口与反射
            
            
              go
              
              
            
          
          package main
import (
    "fmt"
    "reflect"
)
type Shape interface {
    area() float64
}
type Circle struct {
    radius float64
}
func (c Circle) area() float64 {
    return 3.14 * c.radius * c.radius
}
func printArea(s Shape) {
    fmt.Println("Area:", s.area())
}
func main() {
    c := Circle{radius: 5}
    printArea(c)
    
    t := reflect.TypeOf(c)
    fmt.Println("Type:", t.Name())
    fmt.Println("Kind:", t.Kind())
}三、并发
Go 原生支持并发编程,主要通过 goroutine 和 channel 实现。
- 
goroutine: - 轻量级线程,由 Go 运行时管理。
- 使用 go关键字启动新的 goroutine。
 
- 
channel: - 用于 goroutine 之间的通信。
- 可以使用 make函数创建 channel。
 
示例代码:goroutine 和 channel
            
            
              go
              
              
            
          
          func sayHello() {
    fmt.Println("Hello")
}
func main() {
    go sayHello()
    fmt.Println("World")
    ch := make(chan int)
    go func() {
        ch <- 42
    }()
    fmt.Println(<-ch)
}四、Web 框架 - Gin
Gin 是一个高效的 Go 语言 Web 框架,非常适合快速开发 RESTful API。
示例代码:使用 Gin 构建简单的 Web 服务
            
            
              go
              
              
            
          
          package main
import (
    "github.com/gin-gonic/gin"
)
func main() {
    r := gin.Default()
    r.GET("/ping", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "pong",
        })
    })
    r.Run() // 监听并在 0.0.0.0:8080 上启动服务
}五、ORM - Gorm
Gorm 是一个功能强大的 Go 语言 ORM 库,提供了方便的数据库操作接口。
示例代码:使用 Gorm 进行数据库操作
            
            
              go
              
              
            
          
          package main
import (
    "gorm.io/driver/sqlite"
    "gorm.io/gorm"
)
type Product struct {
    gorm.Model
    Code  string
    Price uint
}
func main() {
    db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
    if err != nil {
        panic("failed to connect database")
    }
    // 自动迁移模式
    db.AutoMigrate(&Product{})
    // 创建
    db.Create(&Product{Code: "D42", Price: 100})
    // 读取
    var product Product
    db.First(&product, 1) // 根据整型主键查找
    db.First(&product, "code = ?", "D42") // 查找 code 字段值为 D42 的记录
    // 更新 - 更新产品价格为 200
    db.Model(&product).Update("Price", 200)
    // 删除 - 删除产品
    db.Delete(&product, 1)
}六、Thrift
前后端交互基本都是 HTTP 服务,但后端服务间有更好用的通信协议,它就是RPC,可以像调用本地函数一样调用别人的服务,操作还是同步的。Thrift 是其中一种 RPC 框架。
Thrift 基础
在 Thrift 中,您需要先定义服务的接口,然后使用 Thrift 编译器生成对应语言的代码。以下是一个简单的 Thrift 示例。
示例 Thrift IDL 文件:calculator.thrift
            
            
              thrift
              
              
            
          
          namespace go calculator
service Calculator {
    i32 add(1: i32 num1, 2: i32 num2),
    i32 subtract(1: i32 num1, 2: i32 num2)
}生成 Go 代码
使用 Thrift 编译器生成 Go 代码:
            
            
              sh
              
              
            
          
          thrift --gen go calculator.thrift实现 Thrift 服务端
            
            
              go
              
              
            
          
          package main
import (
    "calculator"
    "fmt"
    "git.apache.org/thrift.git/lib/go/thrift"
)
type CalculatorHandler struct{}
func (p *CalculatorHandler) Add(num1 int32, num2 int32) (r int32, err error) {
    return num1 + num2, nil
}
func (p *CalculatorHandler) Subtract(num1 int32, num2 int32) (r int32, err error) {
    return num1 - num2, nil
}
func main() {
    handler := &CalculatorHandler{}
    processor := calculator.NewCalculatorProcessor(handler)
    transport, err := thrift.NewTServerSocket(":9090")
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    server := thrift.NewTSimpleServer2(processor, transport)
    fmt.Println("Starting the simple server... on ", transport.Addr())
    server.Serve()
}实现 Thrift 客户端
            
            
              go
              
              
            
          
          package main
import (
    "calculator"
    "fmt"
    "git.apache.org/thrift.git/lib/go/thrift"
)
func main() {
    transport, err := thrift.NewTSocket("localhost:9090")
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    protocolFactory := thrift.NewTBinaryProtocolFactoryDefault()
    client := calculator.NewCalculatorClientFactory(transport, protocolFactory)
    if err := transport.Open(); err != nil {
        fmt.Println("Error:", err)
        return
    }
    defer transport.Close()
    sum, err := client.Add(1, 1)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    fmt.Println("1 + 1 =", sum)
}总结
本文介绍了 Go 语言的基本结构、流程控制、面向对象编程、并发编程、Web 开发、ORM 和 RPC 框架这些实践中最基础、最常用的知识,希望对你有用~