22

I want to convert uint8 to string but can't figure out how.

package main

import "fmt"
import "strconv"

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

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

Example

This gives me prog.go:11: cannot use str[1] (type uint8) as type int in function argument [process exited with non-zero status]

Any idea?

Chandan
  • 11,465
  • 1
  • 6
  • 25
  • Check the first part of this answer if you are looking for information about slices of uint8 ([]uint8): http://stackoverflow.com/a/28848879/1364759 – Shadoninja Aug 01 '16 at 20:34
  • `string(u)` or `fmt.Sprintf("%s", u)` to set `[]uint8` to a sting. See https://stackoverflow.com/a/62725637/12817546. `[]uint8("abc")` to set a string to `[]uint8`. See https://stackoverflow.com/a/62740786/12817546. –  Jul 09 '20 at 07:36

5 Answers5

31

Simply convert it :

fmt.Println(strconv.Itoa(int(str[1])))
Chandan
  • 11,465
  • 1
  • 6
  • 25
Denys Séguret
  • 372,613
  • 87
  • 782
  • 758
11

There is a difference between converting it or casting it, consider:

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

The string cast prints '\n' (newline), the string conversion prints "10". The difference becomes clear once you regard the []byte conversion of both variants:

[]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
tivio
  • 169
  • 1
  • 5
  • strconv.Itoa(int(s))) - is exactly what I was looking for to convert numeric representation of byte value into string – AbstractVoid May 24 '16 at 23:27
  • There is a difference between conversion and casting. But in Go, casting is not possible. Only conversion is possible in Go. – Jonathan Hall Jun 18 '19 at 09:17
7

You can do it even simpler by using casting, this worked for me:

var c uint8
c = 't'
fmt.Printf(string(c))
Artash
  • 569
  • 6
  • 11
  • Accepted answer is correct. As @tivio explains below, this method does not do what some might expect. – Shadoninja Aug 01 '16 at 20:24
  • casting using `string(c)` is a hack in Go which might be removed soon. See Rob Pikes response to the question on [Reddit](https://www.reddit.com/r/golang/comments/78hxd7/why_is_stringint_a_valid_cast_operation/) – Azeez Olaniran Sep 09 '18 at 23:14
0

There are no automatic conversions of basic types in Go expressions. See https://talks.golang.org/2012/goforc.slide#18. A byte (an alias of uint8) or []byte ([]uint8) has to be set to a bool, number or string.

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) can be used to convert []byte{'G', 'o' } to the string "Go". You can convert any int type to a string with Sprintf. See https://stackoverflow.com/a/41074199/12817546.

But Sprintf uses reflection. See the comment in https://stackoverflow.com/a/22626531/12817546. Using Itoa (Integer to ASCII) is faster. See @DenysSéguret and https://stackoverflow.com/a/38077508/12817546. Quotes edited.

  • A boolean, numeric, or string type can be set to another type. For `float64` see https://stackoverflow.com/a/62753031/12817546, `int` see https://stackoverflow.com/a/62737936/12817546, `[]rune` see https://stackoverflow.com/a/62739051/12817546, `string` see https://stackoverflow.com/a/62740786/12817546 and for `bool` see https://stackoverflow.com/a/62726854/12817546. –  Jul 07 '20 at 09:39
-1

use %c

    str := "Hello"
    fmt.Println(str[1]) // 101
    fmt.Printf("%c\n", str[1])
Inasa Xia
  • 433
  • 5
  • 12