英文:
Check all data keys in golang at once
问题
我有以下代码:
type DisplayObject struct {
ID string `json:"id,omitempty" bson:"id"`
URI string `json:"uri,omitempty" bson:"uri"`
Display string `json:"display,omitempty" bson:"display"`
}
if DisplayObject.ID != "" {
// 做一些事情
}
if DisplayObject.URI != "" {
// 做一些事情
}
if DisplayObject.Display != "" {
// 做一些事情
}
在JavaScript中,我会这样做:
for (var key in DisplayObject) {
if (DisplayObject.hasOwnProperty(key)) {
// 做一些事情
}
}
在Go中,你可以通过使用反射来实现类似的功能。你可以使用reflect
包来获取结构体的字段,并进行相应的操作。以下是一个示例代码:
package main
import (
"fmt"
"reflect"
)
type DisplayObject struct {
ID string `json:"id,omitempty" bson:"id"`
URI string `json:"uri,omitempty" bson:"uri"`
Display string `json:"display,omitempty" bson:"display"`
}
func main() {
displayObject := DisplayObject{
ID: "123",
URI: "",
Display: "Hello",
}
displayObjectValue := reflect.ValueOf(displayObject)
displayObjectType := displayObjectValue.Type()
for i := 0; i < displayObjectValue.NumField(); i++ {
field := displayObjectValue.Field(i)
fieldName := displayObjectType.Field(i).Name
if field.String() != "" {
fmt.Printf("Field %s is not empty\n", fieldName)
// 做一些事情
}
}
}
这个示例代码会遍历DisplayObject
结构体的字段,并检查每个字段的值是否为空。你可以在if
语句中添加相应的操作。
英文:
I have the following code:
type DisplayObject struct {
ID string `json:"id,omitempty" bson:"id"`
URI string `json:"uri,omitempty" bson:"uri"`
Display string `json:"display,omitempty" bson:"display"`
}
if DisplayObject.ID != "" {
// do something
}
if DisplayObject.URI != "" {
// do something
}
if DisplayObject.Display != "" {
// do something
}
In javascript I would do
for (var key in DisplayObject) {
if (DisplayObject.hasOwnProperty(key)) {
// do something
}
}
How can I accomplish this for loop through an object in go?
答案1
得分: 1
你正在尝试比较不可比较的东西。JavaScript对象类似于map[string]interface{}。在你的情况下,也可以是map[string]string,并且对于映射,你可以使用len(m) == 0。
结构体是一个更快的容器,但是更不灵活。你不能改变成员的数量或类型。
英文:
You are trying compare uncomparable. Javascript object is similar to map[string]interface{} . In your case could also be map[string]string and for maps you can use len(m) == 0.
Struct is much faster container, but less flexible container. You cannot change number or types of members.
答案2
得分: 1
你可以使用反射来实现这样的功能:
package main
import (
"fmt"
"reflect"
)
type DisplayObject struct {
ID string `json:"id,omitempty" bson:"id"`
URI string `json:"uri,omitempty" bson:"uri"`
Display string `json:"display,omitempty" bson:"display"`
}
func main() {
displayObj := &DisplayObject{ID: "foo"}
s := reflect.ValueOf(displayObj).Elem()
for i := 0; i < s.NumField(); i++ {
fieldName := s.Type().Field(i).Name
fieldValue := s.Field(i).String()
fmt.Printf("%s: %s\n", fieldName, fieldValue)
// 对字段数据进行操作
}
}
这段代码使用了反射来遍历 DisplayObject
结构体的字段,并打印出每个字段的名称和值。你可以在注释的位置对字段数据进行操作。
英文:
You could use reflection to accomplish something like that:
package main
import (
"fmt"
"reflect"
)
type DisplayObject struct {
ID string `json:"id,omitempty" bson:"id"`
URI string `json:"uri,omitempty" bson:"uri"`
Display string `json:"display,omitempty" bson:"display"`
}
func main() {
displayObj := &DisplayObject{ID: "foo"}
s := reflect.ValueOf(displayObj).Elem()
for i := 0; i < s.NumField(); i++ {
fieldName := s.Type().Field(i).Name
fieldValue := s.Field(i).String()
fmt.Printf("%s: %s\n", fieldName, fieldValue)
// do something with the field data
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论