如何将 interface{} 转换为 bytes.Buffer?

huangapple go评论104阅读模式
英文:

How to convert interface{} to bytes.Buffer

问题

如何将interface{}转换为bytes.Buffer

最小化示例:

  1. package main
  2. import (
  3. "bytes"
  4. "fmt"
  5. )
  6. func ToJson5(any interface{}) string {
  7. if any == nil {
  8. return ``
  9. }
  10. switch any.(type) {
  11. case bytes.Buffer: // 原样返回
  12. return any.(bytes.Buffer).String()
  13. // 其他类型正常工作
  14. }
  15. return ``
  16. }
  17. func main() {
  18. x := bytes.Buffer{}
  19. fmt.Println(ToJson5(x))
  20. }

错误信息如下:

  1. main.go:14: 无法在any.(bytes.Buffer)上调用指针方法
  2. main.go:14: 无法获取any.(bytes.Buffer)的地址

当更改为bytes.Buffer{}(我认为不太正确)时,错误信息如下:

  1. main.go:13: bytes.Buffer字面量(类型为bytes.Buffer)不是一个类型
  2. main.go:14: bytes.Buffer字面量不是一个类型

示例链接

英文:

How to convert interface{} to bytes.Buffer?

Minimal example

  1. package main
  2. import (
  3. "bytes"
  4. "fmt"
  5. )
  6. func ToJson5(any interface{}) string {
  7. if any == nil {
  8. return `''`
  9. }
  10. switch any.(type) {
  11. case bytes.Buffer: // return as is
  12. return any.(bytes.Buffer).String()
  13. // other types works fine
  14. }
  15. return ``
  16. }
  17. func main() {
  18. x := bytes.Buffer{}
  19. fmt.Println(ToJson5(x))
  20. }

The errors was:

  1. main.go:14: cannot call pointer method on any.(bytes.Buffer)
  2. main.go:14: cannot take the address of any.(bytes.Buffer)

When changed to bytes.Buffer{} (that I think less correct), the error was:

  1. main.go:13: bytes.Buffer literal (type bytes.Buffer) is not a type
  2. main.go:14: bytes.Buffer literal is not a type

答案1

得分: 3

你可以在类型切换中使用短变量声明,以在case分支中获得具体的类型值:

  1. switch v := any.(type) {
  2. case bytes.Buffer: // 原样返回
  3. return v.String() // 这里的 v 的类型是 bytes.Buffer
  4. }

Go Playground上尝试一下。

引用规范中的说明:

> 类型切换的保护部分可以包含短变量声明。当使用该形式时,变量在每个分支的隐式块的开头被声明。在列出了一个类型的分支中,变量的类型就是该类型;否则,变量的类型就是类型切换保护部分的表达式的类型。

英文:

You can use a Short variable declaration in the Type switch to have the typed value in the case branches:

  1. switch v := any.(type) {
  2. case bytes.Buffer: // return as is
  3. return v.String() // Here v is of type bytes.Buffer
  4. }

Try it on the Go Playground.

Quoting form the spec:

> The TypeSwitchGuard may include a short variable declaration. When that form is used, the variable is declared at the beginning of the implicit block in each clause. In clauses with a case listing exactly one type, the variable has that type; otherwise, the variable has the type of the expression in the TypeSwitchGuard.

huangapple
  • 本文由 发表于 2015年3月16日 15:00:07
  • 转载请务必保留本文链接:https://go.coder-hub.com/29071186.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定