第七章:标准库与常用包
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://