- 前言
- Go 与操作系统
- Go 内部机制
- Go 基本数据类型
- 4 组合类型的使用
- 5 数据结构
- 6 Go package 中不为人知的知识
- 7 反射和接口
- 8 Go UNIX 系统编程
- 08.1 关于 UNIX 进程
- 08.2 flag 包
- 8.2 flag 包
- 08.3 io.Reader 和 io.Writer 接口
- 08.4 bufio 包
- 08.5 读取文本文件
- 08.6 从文件中读取所需的数据量
- 08.7 为什么我们使用二进制格式
- 08.8 读取 CSV 文件
- 08.9 写入文件
- 08.10 从磁盘加载和保存数据
- 08.11 再看strings包
- 08.12 关于bytes包
- 08.13 文件权限
- 08.14 处理 Unix 信号
- 08.15 Unix 管道编程
- 08.16 遍历目录树
- 08.17 使用 ePBF
- 08.18 关于 syscall.PtraceRegs
- 08.19 跟踪系统调用
- 08.20 User ID 和 group ID
- 08.21 其他资源
- 08.22 练习
- 08.23 总结
- 9 并发 Goroutines、Channel 和 Pipeline
- 10 Go 并发-进阶讨论
- 11 代码测试、优化及分析
- 12 Go 网络编程基础
- 13 网络编程 - 构建服务器与客户端
04.5 字符串
严格来说,Go字符串并不是组合类型,但是Go提供了很多直接操作字符串的函数,第3章提到过Go字符串是值类型,并非像C字符串需要靠指针实现。另外,Go默认支持UTF-8字符串,处理Unicode编码的字符就会非常方便。下面的小节也会讲到字符、rune、字节之间的区别,以及字符串与字符串字面量的不同。
Go字符串实际上是一个字节切片,可以存储任意类型、任意长度的字节。
可以像下面一样定义一个字符串:
const sLiteral = "\x99\x42\x32"
也可以使用字符串字面量:
s2 := "rfsdf"
可以使用len()
得到字符串的长度。
strings.go
将会分4部分展示一些Go字符串的标准操作。
第一部分:
> package main
>
> import (
> "fmt"
> )
>
> func main() {
> const sLiteral= "\x99\x42\x32\x55\x50\x35\x23\x50\x29\x9c"
> fmt.Println(sLiteral)
> fmt.Printf("x: %x\n", sLiteral)
>
> fmt.Printf("sLiteral length: %d\n", len(sLiteral))
每一个\xAB
都代表sLiteral
的一个字符,所以调用len()
就会得到sLiteral
的字符数量。%x
会得到\xAB
中的AB
部分。
第二部分代码:
> for i := 0; i < len(sLiteral); i++ {
> fmt.Printf("%x ", sLiteral[i])
> }
> fmt.Println()
>
> fmt.Printf("q: %q\n", sLiteral)
> fmt.Printf("+q: %+q\n", sLiteral)
> fmt.Printf(" x: % x\n", sLiteral)
>
> fmt.Printf("s: As a string: %s\n", sLiteral)
如代码所示,你可以像操作一个切片那样去操作字符串。使用%q
作为字符串格式化参数,可以安全地打印出带双引号的字符串,%+q
可以保证输出是ASCII格式。
最后,% x
(注意%与x之间的空格)将会在输出的字符之间加上空格,如果你想打印字符串格式,就要使用%s
。
第三部分代码:
> s2 := "€£³"
> for x, y := range s2 {
> fmt.Printf("%#U starts at byte position %d\n", y, x)
> }
>
> fmt.Printf("s2 length: %d\n", len(s2))
在这里定义了字符串s2
,内容是3个unicode字符。使用%#U
可以打印出U+0058
格式的字符,range
关键字能够迭代包含Unicode字符的字符串,这样就可以逐个处理Unicode字符。
len(s2)
的输出可能会令你困惑,解释一下,s2
包含的是Unicode字符,Unicode字符的字节数量是大于该字符串中的元素数量的,而len()
函数计算的是字节数量,所以len(s2)
的值是7而不是3。
最后一部分:
> const s3= "ab12AB"
> fmt.Println("s3:", s3)
> fmt.Printf("x: % x\n", s3)
>
> fmt.Printf("s3 length: %d\n", len(s3))
>
> for i := 0; i < len(s3); i++ {
> fmt.Printf("%x ", s3[i])
> }
> fmt.Println()
>
> }
执行strings.go
的输出是:
go run strings.go
�B2UP5#P)�
x: 9942325550352350299c
sLiteral length: 10
99 42 32 55 50 35 23 50 29 9c
q: "\x99B2UP5#P)\x9c"
+q: "\x99B2UP5#P)\x9c"
x: 99 42 32 55 50 35 23 50 29 9c
s: As a string: �B2UP5#P)�
U+20AC '€' starts at byte position 0
U+00A3 '£' starts at byte position 3
U+00B3 '³' starts at byte position 5
s2 length: 7
s3: ab12AB
x: 61 62 31 32 41 42
s3 length: 6
61 62 31 32 41 42
在不清楚Unicode和UTF-8机制的情况下,你可能会对本节的输出干到困惑,不必恐慌,因为这些在平时的开发中很少使用,基本的fmt.Printf()
和fmt.Println()
就能满足你的需求。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论