模块 8 · 第 2 课(共 5)课程中的37/50~12 min
模块课程(2/5)
`strings` 和 `strconv`
strings 和 strconv 是您将经常使用的两个包。第一个操作字符串(分割、修剪、替换、搜索);第二个在字符串和基本类型(int、float、bool)之间进行转换。
strings:您每天都会使用的功能
Go
import "strings"
strings.ToUpper("ciao") // "CIAO"
strings.ToLower("CIAO") // "ciao"
strings.Contains("ciao mondo", "mo") // true
strings.HasPrefix("foo.txt", "foo") // true
strings.HasSuffix("foo.txt", ".txt") // true
strings.Index("ciao", "a") // 2 (or -1 if absent)
strings.Count("banana", "a") // 3
strings.Split("a,b,c", ",") // []string{"a","b","c"}
strings.SplitN("a,b,c,d", ",", 2) // []string{"a","b,c,d"}
strings.Join([]string{"a","b"}, "-") // "a-b"
strings.TrimSpace(" ciao\n") // "ciao"
strings.Trim("__ciao__", "_") // "ciao"
strings.ReplaceAll("aaa", "a", "b") // "bbb"
strings.Replace("aaa", "a", "b", 2) // "bba" (limit 2)还有 EqualFold 变体用于不分配大小写的比较,以及 Cut(s, sep) (before, after, found) 用于单行解析。
Go
key, val, ok := strings.Cut("name=Ada", "=")
// "name", "Ada", truestrings.Builder 在循环中连接
循环中的串联 s = s + "x" 在每次迭代时分配(字符串是不可变的)。对于在多个步骤中构建的文本,请使用 strings.Builder:
Go
var b strings.Builder
for i := 0; i < 1000; i++ {
b.WriteString("x")
}
out := b.String()摊销分配,没有无用的副本。
strconv:字符串 ↔ 数字/布尔转换
Go
import "strconv"
n, err := strconv.Atoi("42") // int from decimal
s := strconv.Itoa(42) // "42"
b, err := strconv.ParseBool("true")
// Generic versions with base and optional bit-size
i64, err := strconv.ParseInt("ff", 16, 64) // 255
u64, err := strconv.ParseUint("7", 10, 8) // 7
f, err := strconv.ParseFloat("3.14", 64) // 3.14
// Number → string
strconv.FormatInt(255, 16) // "ff"
strconv.FormatFloat(3.14, 'f', 2, 64) // "3.14"
strconv.FormatBool(true) // "true"Atoi/Itoa 是符合人体工程学的快捷键;要对基数和大小进行精细控制,请使用 ParseInt/FormatInt。
处理解析错误
Atoi 返回 (int, error)。错误几乎总是 *strconv.NumError,您可以通过 errors.Is 与哨兵 strconv.ErrSyntax 或 strconv.ErrRange 进行比较:
Go
n, err := strconv.Atoi(input)
switch {
case errors.Is(err, strconv.ErrSyntax):
return fmt.Errorf("input non numerico: %q", input)
case errors.Is(err, strconv.ErrRange):
return fmt.Errorf("numero fuori range: %q", input)
case err != nil:
return err
}
_ = n练习
锻炼#go.m8.l2.e1
尝试:0加载中...
用逗号分割字符串 'a,b,c' 并打印结果切片。
正在加载编辑器...
3 次尝试后可用的解决方案
锻炼#go.m8.l2.e2
尝试:0加载中...
使用 strconv.Atoi 将字符串 '42' 转换为 int,处理错误并打印数字。
正在加载编辑器...
3 次尝试后可用的解决方案
Quiz#go.m8.l2.e3
准备好将整数 42 转换为字符串“42”的惯用方法是什么?
Go
s := ???(42)
// vogliamo s == "42"