- 文档
- 教程
【免费下载链接】build-web-application-with-golang
A golang ebook intro how to build a web with golang
字符串是 Web 开发中最常见的"数据载体":用户在表单里输入的用户名、数据库中读取出来的记录、URL 中的查询参数、日志里拼接的消息,几乎全部以字符串形式存在。因此,掌握高效、安全、正确的字符串操作,是每个 Go Web 开发者绕不开的基本功。本篇以《Build Web Application with Golang》电子书第 7.6 节(Cadenas / Strings)为骨架,系统讲解 Go 标准库strings与strconv两个包的核心函数,并结合仓库中的真实 Web 示例代码,说明它们在表单处理、输入校验等场景下的实战用法。读完本文,你将能够熟练完成字符串的包含判断、切分、拼接、替换、修剪,以及字符串与整型、浮点型、布尔型之间的双向转换,并理解在 Web 请求处理链路中如何正确使用这些 API。
为什么 Web 开发离不开字符串处理
在 Web 应用中,几乎一切可见的内容——用户输入、数据库访问结果、HTTP 请求与响应——都以字符串形态呈现。我们经常需要对字符串进行分割(如按逗号拆分 CSV 字段)、连接(如把表单多个值拼成一个)、转换(如把"年龄"字符串解析成整数做范围校验)等操作。
Go 标准库为此提供了两个专门的内置包:
strings:提供字符串搜索、拼接、切分、替换、修剪等纯字符串操作;strconv:提供字符串与数值/布尔类型之间的转换(string ↔ int/float/bool)。
它们都属于 Go 标准库,无需第三方依赖,直接import即可使用。下面的内容分别对这两个包中的常用函数逐一展开,并结合仓库中的 Web 示例代码佐证其实际应用。
strings 包:查询、切分与重组字符串
strings包的全部函数都以strings.前缀调用。以下函数是该电子书原文档重点介绍的常用函数,逐个给出签名、语义与可运行示例。
strings.Contains:判断是否包含子串
func Contains(s, substr string) bool检查字符串s是否包含子串substr,返回布尔值。注意空字符串""是任何字符串的子串:
fmt.Println(strings.Contains("seafood", "foo")) // Output:true fmt.Println(strings.Contains("seafood", "bar")) // Output:false fmt.Println(strings.Contains("seafood", "")) // Output:true fmt.Println(strings.Contains("", "")) // Output:truestrings.Join:按分隔符拼接切片
func Join(a []string, sep string) string将字符串切片a的所有元素用分隔符sep连接成一个字符串。它是Split的逆操作,也是 Web 处理中最常用的拼接手段之一:
s := []string{"foo", "bar", "baz"} fmt.Println(strings.Join(s, ", ")) //Output:foo, bar, baz仓库实战印证:在 第 3.2 节示例代码 与 第 4.1 节表单示例代码 中,服务端解析表单后正是用strings.Join(v, "")把每个表单字段的多个值拼成单个字符串再输出:
for k, v := range r.Form { fmt.Println("key:", k) fmt.Println("val:", strings.Join(v, "")) }这是因为 Go 中r.Form是map[string][]string,同一个 key 可能对应多个值(如多选框),strings.Join恰好能完成[]string → string的规整。
strings.Index:查找子串位置
func Index(s, sep string) int返回sep在s中第一次出现的下标(从 0 开始);找不到时返回-1。空子串会返回 0:
fmt.Println(strings.Index("chicken", "ken")) // Output:4 fmt.Println(strings.Index("chicken", "dmr")) // Output:-1strings.Repeat:重复生成字符串
func Repeat(s string, count int) string把字符串s重复count次后返回,常用于生成占位符或对齐文本:
fmt.Println("ba" + strings.Repeat("na", 2)) //Output:bananastrings.Replace:按次数替换子串
func Replace(s, old, new string, n int) string在s中把old替换为new,n指定替换次数;n < 0表示全部替换:
fmt.Println(strings.Replace("oink oink oink", "k", "ky", 2)) //Output:oinky oinky oink fmt.Println(strings.Replace("oink oink oink", "oink", "moo", -1)) //Output:moo moo moo注意:当old为空字符串时,Replace会在每个字符间隙插入new;在 Go 1.12+ 中还提供了strings.ReplaceAll(s, old, new),等价于Replace(s, old, new, -1),语义更直白。
strings.Split:按分隔符切分字符串
func Split(s, sep string) []string用分隔符sep把s切分成字符串切片。它有几个容易踩坑的边界行为(下面的输出恰好展示了它们):
fmt.Printf("%q\n", strings.Split("a,b,c", ",")) fmt.Printf("%q\n", strings.Split("a man a plan a canal panama", "a ")) fmt.Printf("%q\n", strings.Split(" xyz ", "")) fmt.Printf("%q\n", strings.Split("", "Bernardo O'Higgins")) //Output:["a" "b" "c"] //["" "man " "plan " "canal panama"] //[" " "x" "y" "z" " "] //[""]边界行为解读:
- 分隔符出现在开头时,切片第一个元素为空串(如第二个例子的
""); sep为空串时按UTF-8 字符切分(第三个例子把" xyz "拆成了[" " "x" "y" "z" " "]);- 空字符串按任意非空分隔符切分时,得到只含一个空串的切片
[""],而不是空切片。
strings.Trim:修剪首尾字符
func Trim(s string, cutset string) string把s头部和尾部出现的、属于cutset字符集合的字符全部去除。cutset是字符集合而非子串,例如"! "表示同时去除感叹号和空格:
fmt.Printf("[%q]", strings.Trim(" !!! Achtung !!! ", "! ")) //Output:["Achtung"]仓库实战印证:在 第 4.2 节输入校验示例 中,checkChineseName与checkUsername都先用strings.Trim(str, " ")去掉用户输入的前后空格再做非空判断与正则匹配,防止用户误输入空白字符绕过校验:
func checkUsername(str string) error { if strings.Trim(str, " ") == "" { return errors.New("Please enter a username.") } return nil }strings.Fields:按空白切分
func Fields(s string) []string去除字符串中的空格(含多个连续空格与首尾空格),并按空白把剩余内容切分成切片。它比Split(s, " ")更健壮,因为连续空格不会被切出空元素:
fmt.Printf("Fields are: %q", strings.Fields(" foo bar baz ")) //Output:Fields are: ["foo" "bar" "baz"]值得补充的 strings 高频函数
除上述原文档重点函数外,strings包中还有一批 Web 开发中同样高频的函数(均以官方文档为准):
| 函数 | 作用 |
|---|---|
HasPrefix(s, prefix string) bool | 判断s是否以prefix开头,常用于路由前缀匹配 |
HasSuffix(s, suffix string) bool | 判断s是否以suffix结尾,常用于判断文件扩展名 |
ToLower(s string) string/ToUpper(s string) string | 全小写 / 全大写转换,常用于归一化用户输入 |
TrimSpace(s string) string | 去除首尾空白字符(等价于Trim(s, " \t\n\r")全集) |
TrimPrefix(s, prefix string) string/TrimSuffix(s, suffix string) string | 仅去除一次指定的前缀 / 后缀 |
Count(s, substr string) int | 统计substr在s中非重叠出现的次数 |
LastIndex(s, sep string) int | 返回最后一次出现的位置,找不到返回 -1 |
EqualFold(s, t string) bool | 忽略大小写比较两个字符串是否相等 |
这些函数与本节主讲的函数同属strings包,组合使用几乎可以覆盖日常 Web 开发中的全部字符串变换需求。
strconv 包:字符串与数值/布尔的相互转换
strconv包负责字符串与其他基本类型之间的转换,主要分为三大系列:Append 系列(转换后追加到字节切片)、Format 系列(把其他类型格式化为字符串)、Parse 系列(把字符串解析为其他类型)。这三者恰好对应 Web 开发中三种典型需求:构造响应缓冲、序列化输出、解析用户输入。
Append 系列:转换后追加到字节切片
Append 系列函数把整数、布尔、带引号的字符串等转换后,追加到现有的字节切片末尾,避免中间产生多余的字符串分配,适合在零拷贝式拼接缓冲区时使用:
package main import ( "fmt" "strconv" ) func main() { str := make([]byte, 0, 100) str = strconv.AppendInt(str, 4567, 10) str = strconv.AppendBool(str, false) str = strconv.AppendQuote(str, "abcdefg") str = strconv.AppendQuoteRune(str, '单') fmt.Println(string(str)) }运行结果:
4567false"abcdefg"'单'要点说明:
AppendInt(dst []byte, i int64, base int):第三个参数base指定进制(本例10为十进制),可选 2~36;AppendBool追加true/false;AppendQuote追加带双引号的 Go 语法字符串字面量(含转义),AppendQuoteRune追加带单引号的字符字面量,因此示例中的中文字符'单'会以'单'形式原样进入缓冲区。
Format 系列:把其他类型格式化为字符串
Format 系列把布尔、浮点、整数、无符号整数等类型转换为字符串,其中Itoa是"整数转字符串"的最常用快捷函数:
package main import ( "fmt" "strconv" ) func main() { a := strconv.FormatBool(false) b := strconv.FormatFloat(123.23, 'g', 12, 64) c := strconv.FormatInt(1234, 10) d := strconv.FormatUint(12345, 10) e := strconv.Itoa(1023) fmt.Println(a, b, c, d, e) }运行结果:
false 123.23 1234 12345 1023参数解读:
FormatFloat(f float64, fmt byte, prec int, bitSize int):fmt是格式标记('g'表示简洁表示、'e'科学计数、'f'定点小数),prec为精度(本例 12),bitSize为源浮点位数(32 或 64);FormatInt(i int64, base int)/FormatUint(i uint64, base int):按base进制输出;Itoa(i int) string:等价于FormatInt(int64(i), 10),是最常用的十进制整型转字符串入口。
Parse 系列:把字符串解析为其他类型
Parse 系列是 Format 的逆操作,把字符串解析为对应类型,同时返回 error——因为任意字符串都可能格式非法。Web 开发中解析用户输入时必须检查这个错误:
package main import ( "fmt" "strconv" ) func main() { a, err := strconv.ParseBool("false") if err != nil { fmt.Println(err) } b, err := strconv.ParseFloat("123.23", 64) if err != nil { fmt.Println(err) } c, err := strconv.ParseInt("1234", 10, 64) if err != nil { fmt.Println(err) } d, err := strconv.ParseUint("12345", 10, 64) if err != nil { fmt.Println(err) } e, err := strconv.Atoi("1023") if err != nil { fmt.Println(err) } fmt.Println(a, b, c, d, e) }运行结果:
false 123.23 1234 12345 1023要点说明:
ParseInt(s string, base int, bitSize int):base可为 0(自动识别前缀0x、0b等)或 2~36;bitSize指定结果位数(0、8、16、32、64),超出范围会返回ErrRange;ParseFloat(s string, bitSize int):bitSize为 32 或 64,决定返回值精度;Atoi(s string) (int, error):等价于ParseInt(s, 10, 0),是解析十进制整数的最常用入口;注意它与 Format 系列的Itoa是方向相反的两个函数——Atoi是ASCIItoInteger(字符串→整数),Itoa是IntegertoASCII(整数→字符串)。原文档西班牙语版中e, err := strconv.Itoa("1023")系笔误(Itoa不接受字符串参数),正确用法即为上例中的strconv.Atoi("1023"),这与本仓库 中文版 7.6 节 与 英文版 7.6 节 的写法一致。
仓库实战印证:在 第 4.2 节输入校验示例 中,年龄字段的校验正是先strconv.Atoi把表单字符串解析为整数,再检查数值范围:
func checkAge(str string) error { age, err := strconv.Atoi(str) if str == "" || err != nil { return errors.New("Please enter a valid age.") } if age < 13 { return errors.New("You must be at least 13 years of age to submit.") } if age > 130 { return errors.New("You're too old to register, grandpa.") } return nil }这段代码同时示范了两个关键实践:先判断解析错误再使用数值,以及err != nil的检查顺序要放在字符串判空之后,确保空输入也能被正确拦截。这正体现了strconv的 Parse 系列在真实 Web 校验链路中的典型用法。
小结:选择正确的 API,写出健壮的 Web 处理代码
本小节围绕字符串这一 Web 开发的核心数据类型,完整介绍了两个标准库包的常用函数:
strings包负责纯字符串操作:Contains做包含判断、Index定位子串、Join/Split完成切片与字符串互转、Replace替换、Trim/Fields清理与切分空白,配合HasPrefix、ToLower、TrimSpace等函数可覆盖绝大多数场景;strconv包负责类型转换:Append 系列面向字节缓冲追加,Format 系列面向输出序列化,Parse 系列面向用户输入解析(务必检查 error)。
从仓库中的真实代码可以看到,这些函数直接嵌入了表单处理(strings.Join拼接多值表单字段)与输入校验(strings.Trim去除空白、strconv.Atoi解析年龄)等 Web 核心链路。结合电子书第 7 章"文本文件处理"的整体脉络——前面章节已讲完 XML、JSON、正则、模板、文件操作——本节补上了最基础也最通用的字符串处理一环。下一节 小结 将对本章内容做整体回顾;完整的章节导航可参考 目录。
- 文档
- 教程
【免费下载链接】build-web-application-with-golang
A golang ebook intro how to build a web with golang
相关推荐
Go Web 开发中的字符串处理:标准库 strings 与 strconv 实战指南(build-web-application-with-golang)
Go Web 开发中的字符串处理:标准库 strings 与 strconv 实战指南(build web application with golang) 在
文档教程Go Web 开发字符串处理实战:strings 与 strconv 标准库完全指南(build-web-application-with-golang)
Go Web 开发字符串处理实战:strings 与 strconv 标准库完全指南(build web application with golang) 在
文档教程convformer_m36.sail_in1k 模型部署完整方案:从开发到生产环境的最佳实践
convformer_m36.sail_in1k 模型部署完整方案:从开发到生产环境的最佳实践 想要快速掌握convformer_m36.sail_in1k图像
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考