【问题标题】:golang for loop a string, but it prints 'char' as int, why?golang for循环一个字符串,但它打印\'char\'为int,为什么?
【发布时间】:2022-08-20 15:58:00
【问题描述】:
一个非常简单的 go 函数:
func genString(v string) {
for _, c := range v {
fmt.Println(c)
}
}
调用:
func TestBasics(t *testing.T) {
genString(\"abc\")
}
然后我跑了:
go test -v -run TestBasics xxxxxx
它打印:
97
98
99
我希望它应该打印
a
b
c
但它打印相应的整数值?为什么,如何修复它并只打印char?
谢谢!
标签:
string
go
printing
char
integer
【解决方案1】:
为什么
在string 上循环使用range 将为您提供runes 的序列。
For range spec:
Range expression 1st value 2nd value
array or slice a [n]E, *[n]E, or []E index i int a[i] E
string s string type index i int see below rune
map m map[K]V key k K m[k] V
channel c chan E, <-chan E element e E
(注意表格中的第二行和最后一列)
- 对于字符串值,“范围”子句遍历 Unicode 代码点在从字节索引 0 开始的字符串中。连续
迭代,索引值将是第一个字节的索引
字符串中连续的 UTF-8 编码代码点,以及第二
rune 类型的值将是相应代码的值
观点.如果迭代遇到无效的 UTF-8 序列,则
第二个值将是 0xFFFD,Unicode 替换字符,并且
下一次迭代将推进字符串中的一个字节。
rune 值是整数标识一个值Unicode 码位.
类型本身只是int32 的别名。
如何修复它并仅打印字符
使用fmt.Printf 和%c 动词来打印字符值,即fmt.Printf("%c\n", c)
fmt printing verbs doc:
整数:
%b base 2
%c the character represented by the corresponding Unicode code point
%d base 10
%o base 8
%O base 8 with 0o prefix
%q a single-quoted character literal safely escaped with Go syntax.
%x base 16, with lower-case letters for a-f
%X base 16, with upper-case letters for A-F
%U Unicode format: U+1234; same as "U+%04X"
(注意表中的第二行)
for _, c := range "abc" {
fmt.Printf("%c\n", c)
}
https://go.dev/play/p/BEjJof4XvIk
【解决方案2】:
将函数 gen 字符串更改为
func genstring(v string) {
for _, c := range v {
fmt.Println(string(c))
}
}