In this quick guide, you’ll learn to deal with comparing struct objects containing referential composite properties like slices, maps or channels etc.
If I want to check if a struct object is empty, my initial thought would have been to simple check it like this
var oObj = A{}
if (aObj == A{}) {
// ... handle null case
} else {
// ... handle non-null case
}
But sometimes, we get an error like this,
invalid operation: aObj == A{} (struct containing B cannot be compared)
why?
let’s take a look at the actual struct definition.
// ...
type A struct {
a uint
b B
}
type B struct {
ok bool
values []string
}
// ...
Yes. The issue lies in the []string
(slice) composite datatype as a property of struct B.
The ==
based equality check between struct objects only holds if the struct is a pure struct (or) a select few composite datatypes.
A pure struct has basic datatype like int
, string
, float64
, bool
etc.
If any property is of type slice
, map
or another struct containing said composite types, then the above code will not run (atleast the code won’t compile).
So what now?
We can configure a method called, let’s say,
isEmpty
for a struct, that returns true
if the nested composite type’s null value is checked.
I can define a isEmpty
like method on the struct A and B, to finally check the null value of the composite type that is hindering the basic comparison operation.
If the nested struct(s) still aren’t pure enough, then we do the same for that so we check for their isEmpty
and so on until we find the composite types affecting the basic comparison operation.
// ...
func (aObj A) isEmpty() bool {
return aObj.b.isEmpty()
}
func (bObj B) isEmpty() bool {
return bObj.values == nil // Assuming if 'values' is empty, then object can be considered empty.
}
// ...
so now, the the implementation would go like this,
// ...
var aObj = A{}
if aObj.isEmpty() {
// ... handle null case
} else {
// ... handle non-null case
}
// ...
If the nested layers goes deep, then it might be the right time to rethink the design but that depends on the use-case.
I hope you found this useful.
👋 — @TnvMadhav