
第9章标准库精讲9.1 fmt - 格式化输入输出importfmt// Print 系列fmt.Print(Hello)// 不换行fmt.Println(Hello)// 换行fmt.Printf(Name: %s\n,张三)// 格式化输出// Scan 系列varnamestringfmt.Print(请输入名字: )fmt.Scan(name)// Sprint 系列返回字符串s:fmt.Sprintf(Name: %s, Age: %d,张三,25)// Fprint 系列写入文件fmt.Fprintf(os.Stdout,输出到标准输出\n)9.2 strings - 字符串处理importstringss:Hello, World// 基本操作fmt.Println(len(s))// 12fmt.Println(strings.ToUpper(s))// HELLO, WORLDfmt.Println(strings.ToLower(s))// hello, worldfmt.Println(strings.TrimSpace( hi ))// hi// 查找fmt.Println(strings.Contains(s,World))// truefmt.Println(strings.HasPrefix(s,Hello))// truefmt.Println(strings.HasSuffix(s,World))// truefmt.Println(strings.Index(s,World))// 7// 分割与连接words:strings.Split(a,b,c,,)// [a, b, c]result:strings.Join(words,-)// a-b-c// 替换newS:strings.Replace(s,World,Go,1)// 重复fmt.Println(strings.Repeat(ha,3))// hahaha// Builder高效构建字符串varbuilder strings.Builderfori:0;i1000;i{builder.WriteString(a)}result:builder.String()9.3 strconv - 字符串转换importstrconv// 字符串转数值n,err:strconv.Atoi(42)// 字符串转整数f,err:strconv.ParseFloat(3.14,64)// 字符串转浮点数b,err:strconv.ParseBool(true)// 字符串转布尔值// 数值转字符串s:strconv.Itoa(42)// 整数转字符串sstrconv.FormatFloat(3.14,f,2,64)// 浮点数转字符串sstrconv.FormatBool(true)// 布尔值转字符串// 进制转换sstrconv.FormatInt(255,16)// ff十六进制n,_strconv.ParseInt(ff,16,64)// 2559.4 os - 操作系统接口importos// 文件操作file,err:os.Create(test.txt)iferr!nil{log.Fatal(err)}deferfile.Close()// 写入文件file.WriteString(Hello, World\n)// 读取文件data,err:os.ReadFile(test.txt)iferr!nil{log.Fatal(err)}fmt.Println(string(data))// 文件信息info,err:os.Stat(test.txt)iferr!nil{log.Fatal(err)}fmt.Println(大小:,info.Size())fmt.Println(修改时间:,info.ModTime())// 目录操作os.MkdirAll(path/to/dir,0755)entries,_:os.ReadDir(.)for_,entry:rangeentries{fmt.Println(entry.Name(),entry.IsDir())}// 环境变量os.Getenv(PATH)os.Setenv(MY_VAR,value)// 命令行参数args:os.Args fmt.Println(args)9.5 io - I/O 操作importio// io.Reader 接口funcreadAll(r io.Reader)([]byte,error){returnio.ReadAll(r)}// io.Writer 接口funcwriteAll(w io.Writer,data[]byte)error{_,err:w.Write(data)returnerr}// io.CopyfunccopyFile(src,dststring)error{srcFile,err:os.Open(src)iferr!nil{returnerr}defersrcFile.Close()dstFile,err:os.Create(dst)iferr!nil{returnerr}deferdstFile.Close()_,errio.Copy(dstFile,srcFile)returnerr}// io.TeeReader同时读取和写入r:io.TeeReader(os.Stdin,os.Stdout)9.6 json - JSON 处理importencoding/json// 结构体定义带标签typeUserstruct{IDintjson:idNamestringjson:nameEmailstringjson:emailAgeintjson:age,omitempty}// 序列化Marshaluser:User{ID:1,Name:张三,Email:zhangsanexample.com}jsonData,err:json.Marshal(user)fmt.Println(string(jsonData))// 反序列化UnmarshaljsonString:{id:1,name:张三,email:zhangsanexample.com}varuser2 User errjson.Unmarshal([]byte(jsonString),user2)// 编码器流式处理encoder:json.NewEncoder(os.Stdout)encoder.Encode(user)// 解码器流式处理decoder:json.NewDecoder(os.Stdin)varuser3 User decoder.Decode(user3)// 格式化输出jsonData,_json.MarshalIndent(user,, )fmt.Println(string(jsonData))9.7 time - 时间处理importtime// 当前时间now:time.Now()fmt.Println(now)// 创建特定时间t:time.Date(2024,1,1,12,0,0,0,time.UTC)// 解析时间字符串t,err:time.Parse(2006-01-02 15:04:05,2024-01-01 12:00:00)// 格式化时间fmt.Println(now.Format(2006-01-02 15:04:05))// 时间计算tomorrow:now.Add(24*time.Hour)lastWeek:now.Add(-7*24*time.Hour)// 时间比较ifnow.After(tomorrow){fmt.Println(现在是未来)}// 定时器ticker:time.NewTicker(1*time.Second)forrangeticker.C{fmt.Println(Tick)}// Sleeptime.Sleep(1*time.Second)9.8 log - 日志处理importlog// 基本日志log.Println(这是一条日志)log.Printf(用户 %s 登录了,张三)// 设置日志前缀log.SetPrefix([INFO] )// 设置日志标志log.SetFlags(log.LstdFlags|log.Lshortfile)// 日志输出到文件file,err:os.OpenFile(app.log,os.O_CREATE|os.O_WRONLY|os.O_APPEND,0666)iferr!nil{log.Fatal(err)}log.SetOutput(file)// 不同级别的日志log.Println(INFO: 服务器启动)log.Println(ERROR: 连接失败)9.9 sync - 同步原语importsync// WaitGroupvarwg sync.WaitGroup wg.Add(1)gofunc(){deferwg.Done()// 工作...}()wg.Wait()// Mutexvarmu sync.Mutex mu.Lock()// 临界区mu.Unlock()// Oncevaronce sync.Once once.Do(func(){// 只执行一次})// Pool对象池varpoolsync.Pool{New:func()interface{}{returnnew(bytes.Buffer)},}buf:pool.Get().(*bytes.Buffer)deferpool.Put(buf)9.10 context - 上下文控制importcontext// 创建上下文ctx:context.Background()ctx,cancel:context.WithCancel(ctx)defercancel()// 带超时的上下文ctx,cancel:context.WithTimeout(ctx,5*time.Second)defercancel()// 带截止时间的上下文ctx,cancel:context.WithDeadline(ctx,time.Now().Add(5*time.Second))defercancel()// 传递值ctxcontext.WithValue(ctx,key,value)value:ctx.Value(key)// 在 goroutine 中使用gofunc(ctx context.Context){select{case-ctx.Done():fmt.Println(上下文取消)returndefault:// 工作...}}(ctx)9.11 练习编写程序读取 CSV 文件并处理数据实现一个简单的 HTTP 服务器编写程序处理 JSON 数据实现一个带日志和超时的网络请求9.12 下一章下一章我们将学习 Go 语言的模块管理与项目结构。