第七章:标准库与常用包

作者:Administrator 发布时间: 2026-03-13 阅读量:1 评论数:0

第七章:标准库与常用包

7.1 fmt格式化

package main
​
import "fmt"
​
func main() {
    // Print - 直接输出
    fmt.Print("Hello ")
    fmt.Print("World\n")
    
    // Println - 带换行
    fmt.Println("Hello", "World")  // 自动加空格
    
    // Printf - 格式化
    name := "张三"
    age := 25
    fmt.Printf("姓名: %s, 年龄: %d\n", name, age)
    
    // 格式化动词
    fmt.Printf("%%v (默认格式): %v\n", name)
    fmt.Printf("%%+v (带字段名): %+v\n", struct{ X int }{X: 1})
    fmt.Printf("%%#v (Go语法): %#v\n", name)
    fmt.Printf("%%T (类型): %T\n", name)
    fmt.Printf("%%t (布尔): %t\n", true)
    fmt.Printf("%%d (整数): %d\n", 100)
    fmt.Printf("%%b (二进制): %b\n", 100)
    fmt.Printf("%%o (八进制): %o\n", 100)
    fmt.Printf("%%x (十六进制): %x\n", 255)
    fmt.Printf("%%X (大写十六进制): %X\n", 255)
    fmt.Printf("%%f (浮点): %f\n", 3.14159)
    fmt.Printf("%%.2f (2位小数): %.2f\n", 3.14159)
    fmt.Printf("%%e (科学计数): %e\n", 123456.78)
    fmt.Printf("%%s (字符串): %s\n", "hello")
    fmt.Printf("%%q (引号字符串): %q\n", "hello")
    fmt.Printf("%%p (指针): %p\n", &age)
    
    // Sprintf - 返回字符串
    str := fmt.Sprintf("Name: %s, Age: %d", name, age)
    fmt.Println(str)
    
    // Fprintf - 写入io.Writer
    fmt.Fprintf(os.Stdout, "标准输出: %s\n", "test")
}

7.2 strings字符串处理

package main
​
import (
    "fmt"
    "strings"
)
​
func main() {
    s := "Hello, World! Hello, Go!"
    
    // 查找
    fmt.Println(strings.Contains(s, "World"))      // true
    fmt.Println(strings.ContainsAny(s, "xyz"))     // false
    fmt.Println(strings.HasPrefix(s, "Hello"))     // true
    fmt.Println(strings.HasSuffix(s, "Go!"))       // true
    fmt.Println(strings.Index(s, "Hello"))         // 0
    fmt.Println(strings.LastIndex(s, "Hello"))     // 14
    fmt.Println(strings.Count(s, "Hello"))         // 2
    
    // 转换
    fmt.Println(strings.ToUpper(s))                // 大写
    fmt.Println(strings.ToLower(s))                // 小写
    fmt.Println(strings.Title("hello world"))      // 首字母大写
    
    // 修剪
    fmt.Println(strings.TrimSpace("  hello  "))
    fmt.Println(strings.Trim("...hello...", "."))
    fmt.Println(strings.TrimLeft("...hello...", "."))
    fmt.Println(strings.TrimRight("...hello...", "."))
    
    // 分割与连接
    parts := strings.Split("a,b,c", ",")
    fmt.Println(parts)  // [a b c]
    
    fmt.Println(strings.Join(parts, "-"))  // a-b-c
    
    // 替换
    fmt.Println(strings.Replace(s, "Hello", "Hi", 1))   // 替换1次
    fmt.Println(strings.ReplaceAll(s, "Hello", "Hi"))   // 替换所有
    
    // 重复
    fmt.Println(strings.Repeat("*", 10))  // **********
    
    // 比较
    fmt.Println(strings.Compare("a", "b"))  // -1
    fmt.Println(strings.EqualFold("Hello", "hello"))  // true(不区分大小写)
    
    // 分割为字段
    fmt.Println(strings.Fields("a  b\tc\nd"))  // [a b c d]
    
    // Builder(高效拼接)
    var builder strings.Builder
    builder.WriteString("Hello")
    builder.WriteString(" ")
    builder.WriteString("World")
    fmt.Println(builder.String())
}

7.3 time时间处理

package main
​
import (
    "fmt"
    "time"
)
​
func main() {
    // 当前时间
    now := time.Now()
    fmt.Println("现在:", now)
    
    // 创建特定时间
    t := time.Date(2024, 1, 15, 10, 30, 0, 0, time.Local)
    fmt.Println("特定时间:", t)
    
    // 解析时间
    t2, _ := time.Parse("2024-01-15 10:30:00", "2024-01-15 10:30:00")
    fmt.Println("解析:", t2)
    
    // 格式化输出
    fmt.Println(now.Format("yyyy-MM-dd HH:mm:ss"))  // 2006-01-02 15:04:05
    fmt.Println(now.Format("2006年01月02日"))
    
    // 获取时间部分
    fmt.Println("年:", now.Year())
    fmt.Println("月:", now.Month())
    fmt.Println("日:", now.Day())
    fmt.Println("星期:", now.Weekday())
    fmt.Println("时间戳:", now.Unix())
    fmt.Println("纳秒:", now.UnixNano())
    
    // 时间运算
    future := now.Add(24 * time.Hour)
    past := now.Add(-7 * 24 * time.Hour)
    fmt.Println("明天:", future)
    fmt.Println("上周:", past)
    
    // 时间差
    diff := future.Sub(now)
    fmt.Println("相差:", diff.Hours(), "小时")
    
    // 比较
    fmt.Println(now.Before(future))  // true
    fmt.Println(now.After(past))     // true
    fmt.Println(now.Equal(now))      // true
    
    // 定时器
    timer := time.NewTimer(2 * time.Second)
    fmt.Println("等待2秒...")
    <-timer.C
    fmt.Println("时间到!")
    
    // Ticker(周期性)
    ticker := time.NewTicker(1 * time.Second)
    go func() {
        for t := range ticker.C {
            fmt.Println("Tick:", t)
        }
    }()
    time.Sleep(3 * time.Second)
    ticker.Stop()
    
    // Sleep
    fmt.Println("Sleep 1秒...")
    time.Sleep(1 * time.Second)
    fmt.Println("Wake up!")
}

7.4 os文件操作

package main
​
import (
    "fmt"
    "os"
    "path/filepath"
)
​
func main() {
    // 创建目录
    os.Mkdir("testdir", 0755)
    os.MkdirAll("testdir/subdir/nested", 0755)
    
    // 创建文件
    file, err := os.Create("test.txt")
    if err != nil {
        fmt.Println("创建失败:", err)
        return
    }
    defer file.Close()
    
    // 写入
    file.WriteString("Hello, World!\n")
    file.Write([]byte("第二行\n"))
    
    // 读取
    data, err := os.ReadFile("test.txt")
    if err != nil {
        fmt.Println("读取失败:", err)
        return
    }
    fmt.Println(string(data))
    
    // 文件信息
    info, _ := os.Stat("test.txt")
    fmt.Println("文件名:", info.Name())
    fmt.Println("大小:", info.Size())
    fmt.Println("修改时间:", info.ModTime())
    fmt.Println("是否目录:", info.IsDir())
    
    // 路径操作
    fmt.Println(filepath.Join("a", "b", "c.txt"))
    fmt.Println(filepath.Dir("/home/user/file.txt"))
    fmt.Println(filepath.Base("/home/user/file.txt"))
    fmt.Println(filepath.Ext("/home/user/file.txt"))
    
    // 环境变量
    fmt.Println(os.Getenv("PATH"))
    os.Setenv("MY_VAR", "value")
    
    // 删除
    os.Remove("test.txt")
    os.RemoveAll("testdir")
}

7.5 encoding/json

package main
​
import (
    "encoding/json"
    "fmt"
)
​
type Person struct {
    Name    string `json:"name"`
    Age     int    `json:"age"`
    Email   string `json:"email,omitempty"`  // 空值忽略
    Address string `json:"-"`                 // 忽略
}
​
func main() {
    // 结构体转JSON
    p := Person{Name: "张三", Age: 25, Email: "zs@example.com"}
    data, _ := json.Marshal(p)
    fmt.Println(string(data))
    
    // 美化输出
    pretty, _ := json.MarshalIndent(p, "", "  ")
    fmt.Println(string(pretty))
    
    // JSON转结构体
    jsonStr := `{"name":"李四","age":30}`
    var p2 Person
    json.Unmarshal([]byte(jsonStr), &p2)
    fmt.Println(p2)
    
    // 处理未知结构
    var result map[string]interface{}
    json.Unmarshal([]byte(jsonStr), &result)
    fmt.Println(result["name"])
    
    // 数组
    persons := []Person{
        {Name: "张三", Age: 25},
        {Name: "李四", Age: 30},
    }
    data2, _ := json.Marshal(persons)
    fmt.Println(string(data2))
    
    // Decoder/Encoder(处理流)
    // decoder := json.NewDecoder(reader)
    // encoder := json.NewEncoder(writer)
}

7.6 net/http

package main
​
import (
    "fmt"
    "io"
    "net/http"
    "time"
)
​
func main() {
    // 创建客户端
    client := &http.Client{
        Timeout: 10 * time.Second,
    }
    
    // GET请求
    resp, err := client.Get("https://api.github.com")
    if err != nil {
        fmt.Println("请求失败:", err)
        return
    }
    defer resp.Body.Close()
    
    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body[:500]))
    
    // POST请求
    // resp, err := client.Post(url, "application/json", body)
    
    // 自定义请求
    req, _ := http.NewRequest("GET", "https://


评论