【问题标题】:How to convert uint8 to string如何将uint8转换为字符串
【发布时间】:2013-10-13 22:25:21
【问题描述】:

http://play.golang.org/p/BoZkHC8_uA

我想将 uint8 转换为字符串,但不知道怎么做。

  package main

  import "fmt"
  import "strconv"

  func main() {

    str := "Hello"
    fmt.Println(str[1])  // 101

    fmt.Println(strconv.Itoa(str[1]))
  }

这给了我prog.go:11: cannot use str[1] (type uint8) as type int in function argument [process exited with non-zero status]

有什么想法吗?

【问题讨论】:

标签: go


【解决方案1】:

使用%c

    str := "Hello"
    fmt.Println(str[1]) // 101
    fmt.Printf("%c\n", str[1])

【讨论】:

    【解决方案2】:

    Go 表达式中没有基本类型的自动转换。见https://talks.golang.org/2012/goforc.slide#18byteuint8 的别名)或[]byte ([]uint8) 必须设置为布尔值、数字或字符串。

    package main
    
    import (
        . "fmt"
    )
    
    func main() {
        b := []byte{'G', 'o'}
        c := []interface{}{b[0], float64(b[0]), int(b[0]), rune(b[0]), string(b[0]), Sprintf("%s", b), b[0] != 0}
        checkType(c)
    }
    
    func checkType(s []interface{}) {
        for k, _ := range s {
            // uint8 71, float64 71, int 71, int32 71, string G, string Go, bool true
            Printf("%T %v\n", s[k], s[k])
        }
    }
    

    Sprintf("%s", b) 可用于将[]byte{'G', 'o' } 转换为字符串“Go”。您可以使用 Sprintf 将任何 int 类型转换为字符串。见https://stackoverflow.com/a/41074199/12817546

    但是Sprintf 使用反射。请参阅https://stackoverflow.com/a/22626531/12817546 中的评论。使用Itoa(整数到ASCII)更快。请参阅@DenysSéguret 和 https://stackoverflow.com/a/38077508/12817546。引用已编辑。

    【讨论】:

    【解决方案3】:

    转换或强制转换有区别,请考虑:

    var s uint8 = 10
    fmt.Print(string(s))
    fmt.Print(strconv.Itoa(int(s)))
    

    字符串转换打印'\n'(换行符),字符串转换打印“10”。一旦您考虑了两种变体的 []byte 转换,差异就会变得很明显:

    []byte(string(s)) == [10] // the single character represented by 10
    []byte(strconv.Itoa(int(s))) == [49, 48] // character encoding for '1' and '0'
    
    see this code in play.golang.org

    【讨论】:

    • strconv.Itoa(int(s))) - 正是我正在寻找的将字节值的数字表示转换为字符串
    • 转换和强制转换是有区别的。但是在 Go 中,强制转换是不可能的。在 Go 中只能进行转换。
    【解决方案4】:

    你可以通过使用强制转换更简单,这对我有用:

    var c uint8
    c = 't'
    fmt.Printf(string(c))
    

    【讨论】:

    • 接受的答案是正确的。正如@tivio 在下面解释的那样,这种方法并没有达到某些人的预期。
    • 使用 string(c) 进行强制转换是 Go 中的一个 hack,可能很快就会被删除。请参阅 Rob Pikes 在Reddit 上对问题的回复
    【解决方案5】:

    只需convert it

        fmt.Println(strconv.Itoa(int(str[1])))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-06
      相关资源
      最近更新 更多