web-dev-qa-db-fra.com

Comment convertir une valeur booléenne en chaîne dans Go?

J'essaie de convertir un bool appelé isExist en un string (true ou false) en utilisant string(isExist) mais ça ne marche pas. Quelle est la manière idiomatique de faire cela dans Go?

37
Kin

utiliser le paquet strconv

docs

strconv.FormatBool(v)

func FormatBool (chaîne) FormatBool renvoie "true" ou "false"
en fonction de la valeur de b

70
Brrrr

vous pouvez utiliser strconv.FormatBool comme ça:

package main

import "fmt"
import "strconv"

func main() {
    isExist := true
    str := strconv.FormatBool(isExist)
    fmt.Println(str)        //true
    fmt.Printf("%q\n", str) //"true"
}

ou vous pouvez utiliser fmt.Sprint comme ça:

package main

import "fmt"

func main() {
    isExist := true
    str := fmt.Sprint(isExist)
    fmt.Println(str)        //true
    fmt.Printf("%q\n", str) //"true"
}

ou écrivez comme strconv.FormatBool:

// FormatBool returns "true" or "false" according to the value of b
func FormatBool(b bool) string {
    if b {
        return "true"
    }
    return "false"
}
6
user6169399

Les deux options principales sont:

  1. strconv.FormatBool(bool) string
  2. fmt.Sprintf(string, bool) string avec les formateurs "%t" ou "%v".

Notez que strconv.FormatBool(...) est considérablement plus rapide que fmt.Sprintf(...), comme le montrent les points de repère suivants:

func Benchmark_StrconvFormatBool(b *testing.B) {
  for i := 0; i < b.N; i++ {
    strconv.FormatBool(true)  // => "true"
    strconv.FormatBool(false) // => "false"
  }
}

func Benchmark_FmtSprintfT(b *testing.B) {
  for i := 0; i < b.N; i++ {
    fmt.Sprintf("%t", true)  // => "true"
    fmt.Sprintf("%t", false) // => "false"
  }
}

func Benchmark_FmtSprintfV(b *testing.B) {
  for i := 0; i < b.N; i++ {
    fmt.Sprintf("%v", true)  // => "true"
    fmt.Sprintf("%v", false) // => "false"
  }
}

Courir comme:

$ go test -bench=. ./boolstr_test.go 
goos: darwin
goarch: AMD64
Benchmark_StrconvFormatBool-8       2000000000           0.30 ns/op
Benchmark_FmtSprintfT-8             10000000           130 ns/op
Benchmark_FmtSprintfV-8             10000000           130 ns/op
PASS
ok      command-line-arguments  3.531s
5
maerics

Utilisez simplement fmt.Sprintf("%v", isExist), comme pour presque tous les types.

3
akim