Go 中如何将字符串传递给接受 []byte 类型参数的函数并正确输出结果

在 go 中调用如 blackfriday.markdowncommon 这类接受 []byte 参数的函数时,需先将 string 显式转换为 []byte;而函数返回的 []byte 也需显式转回 string 才能正常打印 html 内容。

Go 的类型系统严格区分 string 和 []byte:前者是只读的 UTF-8 编码字节序列,后者是可变的字节切片。虽然二者底层数据兼容,但不能隐式转换——这正是你遇到编译错误 cannot use input (type string) as type []byte 的根本原因。

✅ 正确做法分两步:

  1. 传参时:用 []byte(input) 将字符串转为字节切片;
  2. 输出时:用 string(output) 将返回的 []byte 转回字符串,才能以可读 HTML 形式打印。

修正后的完整代码如下:

package main

import (
    "fmt"
    "github.com/russross/blackfriday"
)

func main() {
    input := "this is a test"
    output := blackfriday.MarkdownCommon([]byte(input)) // ✅ 转换为 []byte 传入

    fmt.Println(string(output)) // ✅ 转回 string 后打印 HTML
}

运行后将输出:

this is a test

⚠️ 注意事项:

  • []byte(s) 和 string(b) 是零拷贝转换(仅复制头信息,不复制底层数据),性能高效;
  • 不要误用 fmt.Printf("%s", output) —— 虽然也能工作,但语义不如 string(output) 清晰,且在非 UTF-8 字节流场景下可能触发错误;
  • blackfriday v2 已归档,推荐

    升级至 blackfriday/v2 或更现代的替代库(如 goldmark),其 API 更符合 Go 最佳实践(例如直接接受 []byte 并返回 []byte,保持类型一致性)。

总结:Go 中 string ↔ []byte 的双向转换是基础且高频操作,务必掌握其显式语法与适用场景——它不是“绕过类型系统”,而是尊重类型安全前提下的精准表达。