结构体中的可选数组

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

Optional array in struct

问题

我想在结构体中将一个数组设为可选,并在函数中使用if else语句。

type TestValues struct {
	Test1         string   `json:"test1"`
	DefaultTests  []string `json:"__tests,omitempty"`
	Test2         string   `json:"__Test2"`
}
func (x *Controller) createTest(context *gin.Context, uniqueId string, testBody *TestValues) (*http.Response, error) {
	if testBody.DefaultTests != nil {
		postBody, err := json.Marshal(map[string]interface{}{
			"Test2":         testBody.Test2,
			"Test1":         testBody.Test1,
			"defaultTests":  testBody.DefaultTests,
			"uniqueId":      uniqueId,
		})
	} else {
		postBody, err := json.Marshal(map[string]interface{}{
			"Test2":         testBody.Test2,
			"Test1":         testBody.Test1,
			"uniqueId":      uniqueId,
		})
	}

	...
}

当我运行代码时,它告诉我DefaultTests是未定义的数组,但我不希望出现这个错误,因为DefaultTests可以存在,有时它在JSON中不存在,这就是为什么我想将其设为可选的原因。if else部分也没有起作用。

英文:

I want to make an array optional in struct and use it with an if else in a func.

type TestValues struct {
	Test1 string `json:"test1"`
	DefaultTests []string `json:"__tests"`

	//DefaultTests *array `json:"__tests,omitempty" validate:"option"`
	Test2 string `json:"__Test2"`
}
func (x *Controller) createTest(context *gin.Context, uniqueId string, testBody *TestValues) (*http.Response, error) {

	if testBody.DefaultTags {
		postBody, err := json.Marshal(map[string]string{
			"Test2":              testBody.Test2,
			"Test1":                  testBody.Test1,
			"defaultTests": 	    testBody.DefaultTests,
			"uniqueId":                  uniqueId,
		})
	} else {
		postBody, err := json.Marshal(map[string]string{
			"Test2":              testBody.Test2,
			"Test1":                  testBody.Test1,
			"uniqueId":                  uniqueId,
		})
	}

	...
}

When I run the code it tells me that DefaultTests is undefined array but I don't want this error to pop because DefaultTests can existe and sometimes it won't be present in the json that's why I want to make it optional. The if else part is not working too.

答案1

得分: 2

在这里检查数组是否为空时,最好使用len()

if len(testBody.DefaultTests) > 0 {
  ...
}

请查看下面结构体中DefaultTests的零值,以更清楚地了解这种行为。

package main

import "fmt"

type TestValues struct {
    Test1        string   `json:"test1"`
    DefaultTests []string `json:"__tests"`

    //DefaultTests *array `json:"__tests,omitempty" validate:"option"`
    Test2 string `json:"__Test2"`
}

func main() {
    var tv = TestValues{Test1: "test"}

    if len(tv.DefaultTests) > 0 {
        fmt.Printf("Default Tests: %v\n", tv.DefaultTests)
    } else {
        fmt.Printf("Default Tests empty value: %v\n", tv.DefaultTests)
    }
}
英文:

It's better to use len() when checking if an array is empty here.

if len(testBody.DefaultTests) > 0 {
  ...
}

Check the Zero value of the DefaultTests in struct below for more clarity on this behaviour

package main

import "fmt"

type TestValues struct {
	Test1        string   `json:"test1"`
	DefaultTests []string `json:"__tests"`

	//DefaultTests *array `json:"__tests,omitempty" validate:"option"`
	Test2 string `json:"__Test2"`
}

func main() {
	var tv = TestValues{Test1: "test"}

	if len(tv.DefaultTests) > 0 {
		fmt.Printf("Default Tests: %v\n", tv.DefaultTests)
	} else {
		fmt.Printf("Default Tests empty value: %v\n", tv.DefaultTests)
	}
}

答案2

得分: 0

这是我最终的代码,包含了Marc的答案:

func (x *Controller) createTest(context *gin.Context, uniqueId string, testBody *TestValues) (*http.Response, error) {
    if len(testBody.DefaultTags) > 0 {
        postBody, err := json.Marshal(testBody.DefaultTags)
    } else {
        postBody, err := json.Marshal(map[string]string{
            "Test2":    testBody.Test2,
            "Test1":    testBody.Test1,
            "uniqueId": uniqueId,
        })
    }
    ...
}

请注意,这只是代码的一部分,可能还有其他未显示的内容。

英文:

Here's my final code with Marc's answer

func (x *Controller) createTest(context *gin.Context, uniqueId string, testBody *TestValues) (*http.Response, error) {

if len(testBody.DefaultTags) > 0 {
  postBody, err := json.Marshal(testBody.DefaultTags)

} else {
    postBody, err := json.Marshal(map[string]string{
        "Test2":              testBody.Test2,
        "Test1":                  testBody.Test1,
        "uniqueId":                  uniqueId,
    })
}

...

}

huangapple
  • 本文由 发表于 2022年12月16日 17:22:45
  • 转载请务必保留本文链接:https://go.coder-hub.com/74822445.html
匿名

发表评论

匿名网友

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

确定