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

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

How to convert interface{} to bytes.Buffer

问题

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

最小化示例:

package main

import (
	"bytes"
	"fmt"
)

func ToJson5(any interface{}) string {
	if any == nil {
		return ``
	}
	switch any.(type) {
	case bytes.Buffer: // 原样返回
		return any.(bytes.Buffer).String()
		// 其他类型正常工作
	}
	return ``
}

func main() {
	x := bytes.Buffer{}
	fmt.Println(ToJson5(x))
}

错误信息如下:

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

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

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

示例链接

英文:

How to convert interface{} to bytes.Buffer?

Minimal example

package main

import (
	"bytes"
	"fmt"
)

func ToJson5(any interface{}) string {
	if any == nil {
		return `''`
	}
	switch any.(type) {
	case bytes.Buffer: // return as is
		return any.(bytes.Buffer).String()
    // other types works fine
	}
	return ``
}

func main() {
	x := bytes.Buffer{}
	fmt.Println(ToJson5(x))
}

The errors was:

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

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

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

答案1

得分: 3

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

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

Go Playground上尝试一下。

引用规范中的说明:

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

英文:

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

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

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:

确定