Golang converting from rune to string

谁说胖子不能爱 提交于 2020-07-31 17:09:32

问题


I have the following code, it is supposed to cast a rune into a string and print it. However, I am getting undefined characters when it is printed. I am unable to figure out where the bug is:

package main

import (
    "fmt"
    "strconv"
    "strings"
    "text/scanner"
)

func main() {
    var b scanner.Scanner
    const a = `a`
    b.Init(strings.NewReader(a))
    c := b.Scan()
    fmt.Println(strconv.QuoteRune(c))
}

回答1:


That's because you used Scanner.Scan() to read a rune but it does something else. Scanner.Scan() can be used to read tokens or runes of special tokens controlled by the Scanner.Mode bitmask, and it returns special constants form the text/scanner package, not the read rune itself.

To read a single rune use Scanner.Next() instead:

c := b.Next()
fmt.Println(c, string(c), strconv.QuoteRune(c))

Output:

97 a 'a'

If you just want to convert a single rune to string, use a simple type conversion. rune is alias for int32, and converting integer numbers to string:

Converting a signed or unsigned integer value to a string type yields a string containing the UTF-8 representation of the integer.

So:

r := rune('a')
fmt.Println(r, string(r))

Outputs:

97 a

Also to loop over the runes of a string value, you can simply use the for ... range construct:

for i, r := range "abc" {
    fmt.Printf("%d - %c (%v)\n", i, r, r)
}

Output:

0 - a (97)
1 - b (98)
2 - c (99)

Or you can simply convert a string value to []rune:

fmt.Println([]rune("abc")) // Output: [97 98 99]

There is also utf8.DecodeRuneInString().

Try the examples on the Go Playground.

Note:

Your original code (using Scanner.Scan()) works like this:

  1. You called Scanner.Init() which sets the Mode (b.Mode) to scanner.GoTokens.
  2. Calling Scanner.Scan() on the input (from "a") returns scanner.Ident because "a" is a valid Go identifier:

    c := b.Scan()
    if c == scanner.Ident {
        fmt.Println("Identifier:", b.TokenText())
    }
    
    // Output: "Identifier: a"
    



回答2:


I know I'm a bit late to the party but here's a []rune to string function:

func runesToString(runes []rune) (outString string) {
    // don't need index so _
    for _, v := range runes {
        outString += string(v)
    }
    return
}

yes, there is a named return but I think it's ok in this case as it reduces the number of lines and the function is only short



来源:https://stackoverflow.com/questions/39245610/golang-converting-from-rune-to-string

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!