【问题标题】: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
    

    (注意表格中的第二行和最后一列)

    1. 对于字符串值,“范围”子句遍历 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))
         
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-15
        • 2021-04-08
        • 2021-09-04
        • 2019-12-23
        相关资源
        最近更新 更多