ZetCode

Golang strconv.AppendBool

最后修改于 2025 年 4 月 20 日

本教程将介绍如何在 Go 中使用 strconv.AppendBool 函数。我们将通过实际示例涵盖布尔值到字符串转换的基础知识。

strconv.AppendBool 函数将布尔值的字符串表示形式附加到字节切片。它对于使用布尔值构建字符串非常高效。

当您需要动态构建字符串时,AppendBool 特别有用。与直接连接字符串相比,它可以避免不必要的分配。

基本的 strconv.AppendBool 示例

strconv.AppendBool 最简单的用法是将一个布尔值附加到一个空的字节切片。这里我们演示了 true 和 false 两种情况。

basic_appendbool.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    b := []byte("Value: ")
    b = strconv.AppendBool(b, true)
    
    fmt.Println(string(b)) // Value: true
    
    b = []byte("Value: ")
    b = strconv.AppendBool(b, false)
    
    fmt.Println(string(b)) // Value: false
}

我们从一个包含 "Value: " 的字节切片开始,然后附加一个布尔值。该函数返回一个新切片,其中包含布尔值的附加字符串表示。

附加到非空切片

strconv.AppendBool 可以附加到具有现有内容的切片。此示例展示了如何通过多次附加来构建复杂的字符串。

non_empty_slice.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    b := []byte("Status: ")
    b = strconv.AppendBool(b, true)
    b = append(b, ", Active: "...)
    b = strconv.AppendBool(b, false)
    
    fmt.Println(string(b)) // Status: true, Active: false
}

我们通过交替使用字符串文字和布尔值来构建状态消息。每次附加操作都会返回一个新切片,我们将其重新赋值给我们的变量。

构建 JSON 数据

一个常见的用例是手动构建 JSON 数据。此示例演示了使用 AppendBool 来构建带有布尔值的 JSON 对象。

json_builder.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    b := []byte(`{"enabled": `)
    b = strconv.AppendBool(b, true)
    b = append(b, `}`...)
    
    fmt.Println(string(b)) // {"enabled": true}
    
    // More complex example
    b = []byte(`{"settings": {"logging": `)
    b = strconv.AppendBool(b, false)
    b = append(b, `, "caching": `...)
    b = strconv.AppendBool(b, true)
    b = append(b, `}}`...)
    
    fmt.Println(string(b)) // {"settings": {"logging": false, "caching": true}}
}

我们通过仔细附加文字和布尔值来构建 JSON 字符串。这种方法对于不使用 marshaling 的简单 JSON 构建非常高效。

性能比较

此示例将 AppendBool 与字符串连接进行比较,以展示其性能优势。

performance.go
package main

import (
    "fmt"
    "strconv"
    "time"
)

func main() {
    const iterations = 1000000
    
    // Using AppendBool
    start := time.Now()
    b := []byte{}
    for i := 0; i < iterations; i++ {
        b = strconv.AppendBool(b[:0], true)
    }
    fmt.Println("AppendBool duration:", time.Since(start))
    
    // Using string concatenation
    start = time.Now()
    s := ""
    for i := 0; i < iterations; i++ {
        s = "true"
    }
    fmt.Println("String concat duration:", time.Since(start))
}

AppendBool 通常比字符串连接更有效,尤其是在构建大型字符串或执行许多操作时。

自定义布尔格式

我们可以使用 AppendBool 创建自定义布尔格式函数。此示例展示了一个将布尔值格式化为 "Yes"/"No" 的函数。

custom_format.go
package main

import (
    "fmt"
    "strconv"
)

func appendYesNo(b []byte, value bool) []byte {
    if value {
        return append(b, "Yes"...)
    }
    return append(b, "No"...)
}

func main() {
    b := []byte("Result: ")
    b = appendYesNo(b, true)
    fmt.Println(string(b)) // Result: Yes
    
    b = []byte("Result: ")
    b = appendYesNo(b, false)
    fmt.Println(string(b)) // Result: No
}

虽然这个例子没有直接使用 AppendBool,但它展示了自定义布尔格式的类似模式。该函数返回一个新切片。

构建 CSV 数据

AppendBool 对于构建带有布尔值的 CSV 数据很有用。此示例展示了如何创建带有混合数据类型的 CSV 记录。

csv_builder.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    b := []byte{}
    
    // CSV header
    b = append(b, "ID,Name,Active\n"...)
    
    // First record
    b = append(b, "1,"...)
    b = append(b, "John Doe,"...)
    b = strconv.AppendBool(b, true)
    b = append(b, '\n')
    
    // Second record
    b = append(b, "2,"...)
    b = append(b, "Jane Smith,"...)
    b = strconv.AppendBool(b, false)
    b = append(b, '\n')
    
    fmt.Println(string(b))
    /* Output:
    ID,Name,Active
    1,John Doe,true
    2,Jane Smith,false
    */
}

我们通过仔细附加每个字段来构建 CSV 文件。布尔值使用 AppendBool 转换为其字符串表示形式。

与其他 Append 函数结合使用

AppendBool 可以与 strconv 包中的其他 Append 函数结合使用。此示例展示了如何构建复杂的字符串。

combined_appends.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    b := []byte("Configuration: ")
    b = append(b, "enabled="...)
    b = strconv.AppendBool(b, true)
    b = append(b, ", threshold="...)
    b = strconv.AppendFloat(b, 3.14, 'f', 2, 64)
    b = append(b, ", retries="...)
    b = strconv.AppendInt(b, 3, 10)
    
    fmt.Println(string(b))
    // Configuration: enabled=true, threshold=3.14, retries=3
}

我们将 AppendBoolAppendFloatAppendInt 结合使用来构建配置字符串。对于复杂的字符串构建,这种方法可以提高内存效率。

来源

Go strconv 包文档

本教程通过各种场景下布尔值到字符串转换的实际示例,介绍了 Go 中的 strconv.AppendBool 函数。

作者

我的名字是 Jan Bodnar,我是一名充满激情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有超过十年的经验。

列出所有 Go 教程