检查具有数组字段的空结构

我有一个嵌套(非嵌入式)结构,其中某些字段类型是数组。</ p>

如何检查此结构的实例是否为空? (不使用迭代!)</ p>

请注意,不能使用 StructIns ==(Struct {})</ code>或使用空实例! 该代码具有以下错误:</ p>

无效的操作:user == model。用户文字(包含模型的结构。无法比较配置)</ code> </ p>

user.Configs.TspConfigs:</ p>

  type TspConfigs struct {
Flights [] Flightsform:“ flights” json:“ flights”
Tours [] Toursform:“ tours” json:“ tours”
保险[] Insurancesform:“ insurances” json:“ insurances”
Hotels [] Hotelsform:“ hotels” json:“ hotels”
}
</ code> </ pre>
</ div>

展开原文

原文

I have a nested (not embedded) struct for which some of field types are arrays.

How can I check if an instance of this struct is empty? (not using iteration!!)

Note that there can't use StructIns == (Struct{}) or by an empty instance! This code have this error:

invalid operation: user == model.User literal (struct containing model.Configs cannot be compared)

user.Configs.TspConfigs:

type TspConfigs struct {
    Flights     []Flights   `form:"flights" json:"flights"`
    Tours       []Tours     `form:"tours" json:"tours"`
    Insurances  []Insurances`form:"insurances" json:"insurances"`
    Hotels      []Hotels    `form:"hotels" json:"hotels"`
}

dpwuvfpu52502
dpwuvfpu52502 迭代是唯一的可能性。
大约 3 年之前 回复

1个回答



这些是 切片,而不是数组。 重要的是要强调,因为数组是可比较的,但切片却不可。 请参见规范:比较运算符。 而且由于切片无法比较,因此由它们构成的结构(具有切片类型的字段的结构)也不具有可比性。</ p>

您可以使用为此, reflect.DeepEqual()</ code> 。 示例:</ p>

  type Foo struct {
A [] int
B [] string
}

f:= Foo {}
fmt.Println(“ 零:”,​​reflect.DeepEqual(f,Foo {}))
f.A = [] int {1}
fmt.Println(“零:”,reflect.DeepEqual(f,Foo {}))
< / code> </ pre>

输出(在进入游乐场</ strong>上尝试一下</ a>):</ p>

 零:true 
零:假
</ code> </ pre>
</ div>

展开原文

原文

Those are slices, not arrays. It's important to emphasize as arrays are comparable but slices are not. See Spec: Comparision operators. And since slices are not comparable, structs composed of them (structs with fields having slice types) are also not comparable.

You may use reflect.DeepEqual() for this. Example:

type Foo struct {
    A []int
    B []string
}

f := Foo{}
fmt.Println("Zero:", reflect.DeepEqual(f, Foo{}))
f.A = []int{1}
fmt.Println("Zero:", reflect.DeepEqual(f, Foo{}))

Output (try it on the Go Playground):

Zero: true
Zero: false

duanliang4009
duanliang4009 我使用了来自github的名为deep或Deep的程序包,该程序包具有与reflect.DeepEqual()类似的方法,该程序还可以识别第一个不相等的组件。
大约 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问