英文:
Print an array of empty interfaces in golang?
问题
我有一个包含field []interface{}
形式字段的结构体。如果我打印该字段,我会得到一个指针引用。如果我尝试解引用该字段,我会得到一个"invalid indirect"错误。
以下是代码示例:
type MyType struct {
field []interface{}
}
myType := //创建一个MyType。Field只是一个数字数组
println(myType.field) // 打印一个指针引用,例如:[1/1]0xc420269aa0
println(*(myType.field)) // 无法编译
如何打印myType.field
中的值?
英文:
I have a struct with a field of the form field []interface{}
. If I print the field, I get back a pointer reference. If I try to dereference the field, I get an error "invalid indirect".
The code is below:
type MyType struct {
field []interface{}
}
myType := //create a MyType. Field is just an array of numbers
println(myType.field) // prints a pointer reference, ex: [1/1]0xc420269aa0
println(*(myType.field)) // doesn't compile
How do I print the values in myType.field
?
答案1
得分: 1
答案是通过循环遍历数组,或者更好地使用fmt.Println
。
func dump(items []interface{}) {
for i := 0; i < len(items); i++ {
fmt.Println(items[i])
}
}
// 或者
fmt.Println(items)
英文:
The answer is to loop through the array, or even better, use fmt.Println
.
func dump(items []interface{}) {
for i := 0; i < len(items); i++ {
fmt.Println(items[i])
}
}
// OR
fmt.Println(items)
答案2
得分: 0
数组接口可以按照以下方式打印:
questionSet := []interface{}{}
// ... 用代码填充问题集合
fmt.Printf("%t", questionSet)
以下是结果:
[%!t(*domain.Question=&{第一个经济学问题3
[{学生的经济学选项1 false}
{学生的经济学选项2 false}
{学生的经济学选项3 true}
{学生的经济学选项4 false}]
[{经济学第一个主题} {经济学第二个主题}]})
%!t(*domain.Question=&{第二个问题4
[{学生的问题2选项1 false}
{学生的问题2选项2 false}
{学生的问题2选项3 false}
{学生的问题2选项4 false}]
[{第三个主题} {第四个主题}]})]
这里的输出可能不太美观,但至少你可以看到结果并提取相关信息进行进一步处理。
在上面的结果中,domain.Question
是一个结构体,以下是完整的结构体供你参考。希望这能帮助你更好地理解。
type Question struct {
Questions string `json:"questions,omitempty" bson:"questions"`
Marks string `json:"marks,omitempty" bson:"marks"`
Options []QuestionOptions `json:"options,omitempty" bson:"options"`
Topics []QuestionTopic `json:"topics,omitempty" bson:"topics"`
}
type QuestionOptions struct {
Option string `json:"option" bson:"option"`
Correct bool `json:"correct" bson:"correct"`
}
type QuestionTopic struct {
Topic string `json:"topic" bson:"topic"`
}
请注意,%t
是用来打印布尔值的动词(参见文档概述:https://golang.org/pkg/fmt/),尽管目前可以使用它来转储值的内容,但这不是 Go 作者预期的行为,因此这种行为可能会在将来发生变化。
祝一切顺利,
英文:
Array interfaces can be printed as follows
questionSet := []interface{}{}
// ... code to fillup the question set
fmt.Printf("%t", questionSet)
and here is the result
[%!t(*domain.Question=&{First Economics question 3
[{Economics option 1 for student false}
{Economics option 2 for student false}
{Economics option 3 for student true}
{Economics option 4 for student false}]
[{Economics first topic} {Economics second topic}]})
%!t(*domain.Question=&{second Question 4
[{Qs2 Option 1 for student false}
{Qs2 Option 2 for student false}
{Qs2 Option 3 for student false}
{Qs2 Option 4 for student false}]
[{third topic} {fourth topic}]})]
The output here is not very pretty but at least you can see the result and extract your relevant information for further process.
In the above result domain.Question
is a struct and here is the complete struct for your reference. Hope this will help you to understand better.
type Question struct {
Questions string `json:"questions,omitempty" bson:"questions"`
Marks string `json:"marks,omitempty" bson:"marks"`
Options []QuestionOptions `json:"options,omitempty" bson:"options"`
Topics []QuestionTopic `json:"topics,omitempty" bson:"topics"`
}
type QuestionOptions struct {
Option string `json:"option" bson:"option"`
Correct bool `json:"correct" bson:"correct"`
}
type QuestionTopic struct {
Topic string `json:"topic" bson:"topic"`
}
Consider that the verb %t
is designed to print boolean (see the doc overview at https://golang.org/pkg/fmt/), as such, while using it to dump the content of a value works as of today, it is not the behavior intended by go authors, and as such, this behavior might change in the future.
Peace,
答案3
得分: 0
另一种你可以使用的方法是:
package main
import (
"encoding/json"
"fmt"
)
func main() {
fmt.Println(dump(new(bool)))
fmt.Println(dump([]interface{}{new(bool), new(string)}))
}
func dump(x interface{}) string {
json, err := json.MarshalIndent(x, "", " ")
if err != nil {
panic(err)
}
return string(json)
}
// 输出:
// false
// [
// false,
// ""
// ]
请注意,这是一个Go语言的代码示例,它使用encoding/json
包来将数据转换为JSON格式并进行缩进处理。dump
函数接受一个任意类型的参数x
,并返回其JSON表示形式的字符串。在main
函数中,我们使用dump
函数来打印出一个布尔值和一个包含布尔值和字符串的切片的JSON表示形式。
英文:
another way you could use
https://play.golang.org/p/4lLQ4Gb2S0m
package main
import (
"encoding/json"
"fmt"
)
func main() {
fmt.Println(dump(new(bool)))
fmt.Println(dump([]interface{}{new(bool), new(string)}))
}
func dump(x interface{}) string {
json, err := json.MarshalIndent(x, "", " ")
if err != nil {
panic(err)
}
return string(json)
}
// Outputs:
// false
// [
// false,
// ""
// ]
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论