I am trying to convert a bool
called isExist
to a string
(true
or false
) by using string(isExist)
but it does not work. What is the idiomatic way to do this in Go?
use the strconv package
strconv.FormatBool(v)
func FormatBool(b bool) string FormatBool returns "true" or "false"
according to the value of b
you may use strconv.FormatBool
like this:
package main
import "fmt"
import "strconv"
func main() {
isExist := true
str := strconv.FormatBool(isExist)
fmt.Println(str) //true
fmt.Printf("%q
", str) //"true"
}
or you may use fmt.Sprint
like this:
package main
import "fmt"
func main() {
isExist := true
str := fmt.Sprint(isExist)
fmt.Println(str) //true
fmt.Printf("%q
", str) //"true"
}
or write like strconv.FormatBool
:
// FormatBool returns "true" or "false" according to the value of b
func FormatBool(b bool) string {
if b {
return "true"
}
return "false"
}
Just use fmt.Sprintf("%v", isExist)
, as you would for almost all the types.
The two main options are:
strconv.FormatBool(bool) string
fmt.Sprintf(string, bool) string
with the "%t"
or "%v"
formatters.Note that strconv.FormatBool(...)
is considerably faster than fmt.Sprintf(...)
as demonstrated by the following benchmarks:
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"
}
}
Run as:
$ 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