一次性检查所有数据键在Golang中的方法。

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

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:&quot;id,omitempty&quot; bson:&quot;id&quot;`
    URI     string `json:&quot;uri,omitempty&quot; bson:&quot;uri&quot;`
    Display string `json:&quot;display,omitempty&quot; bson:&quot;display&quot;`
}

if DisplayObject.ID != &quot;&quot; {
	// do something
}

if DisplayObject.URI != &quot;&quot; {
	// do something
}

if DisplayObject.Display != &quot;&quot; {
	// 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 (
	&quot;fmt&quot;
	&quot;reflect&quot;
)

type DisplayObject struct {
	ID      string `json:&quot;id,omitempty&quot; bson:&quot;id&quot;`
	URI     string `json:&quot;uri,omitempty&quot; bson:&quot;uri&quot;`
	Display string `json:&quot;display,omitempty&quot; bson:&quot;display&quot;`
}

func main() {
	displayObj := &amp;DisplayObject{ID: &quot;foo&quot;}
	s := reflect.ValueOf(displayObj).Elem()
	for i := 0; i &lt; s.NumField(); i++ {
		fieldName := s.Type().Field(i).Name
		fieldValue := s.Field(i).String()
		fmt.Printf(&quot;%s: %s\n&quot;, fieldName, fieldValue)
        // do something with the field data
	}
}

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

发表评论

匿名网友

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

确定