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?
utiliser le paquet strconv
strconv.FormatBool(v)
func FormatBool (chaîne) FormatBool renvoie "true" ou "false"
en fonction de la valeur de b
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"
}
Les deux options principales sont:
strconv.FormatBool(bool) string
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
Utilisez simplement fmt.Sprintf("%v", isExist)
, comme pour presque tous les types.