What is a struct
in Go?
A struct
or structure in Go is a user-defined type. It helps with composing different types into a single unit.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
type Employee struct { | |
firstName string | |
secondName string | |
id int | |
} |
When can you compare two structures?
In order to compare two structures, it is imperative that all struct
field types are comparable. If the variables being compared belong to different structures, then you will see a compilation error. Golang allows you to compare two structures if they are of the same type and contain the same values for all fields.
Two ways to check for structure equality
==
operatorDeepEqual()
Let’s use the structure defined above and see the two methods in action.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"fmt" | |
"reflect" | |
) | |
type Employee struct { | |
firstName string | |
secondName string | |
id int | |
} | |
func main() { | |
e1 := Employee { | |
firstName: "Anjana", | |
secondName: "Shankar", | |
id: 1, | |
} | |
e2 := Employee { | |
firstName: "Anjana", | |
secondName: "Shankar", | |
id: 1, | |
} | |
e3 := Employee { | |
firstName: "Anjana", | |
secondName: "Shan", | |
id: 1, | |
} | |
fmt.Println("== Operator in practice") | |
if e1 == e2 { | |
fmt.Println("e1 == e2") | |
} else { | |
fmt.Println("e1 != e2") | |
} | |
if e2 == e3 { | |
fmt.Println("e2 == e3") | |
} else { | |
fmt.Println("e2 != e3") | |
} | |
fmt.Println("DeepEqual() in practice") | |
fmt.Println("Is e1 equal to e2 : ", reflect.DeepEqual(e1, e2)) | |
fmt.Println("Is e2 equal to e3 : ", reflect.DeepEqual(e2, e3)) | |
} |
The ==
operator does a strict comparison, whereas the reflect.DeepEqual
method can help you compare the content of the element your pointers point to.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"fmt" | |
"reflect" | |
) | |
type Employee struct { | |
firstName string | |
secondName string | |
id *int | |
} | |
func main() { | |
id1 := 1 | |
id2 := 1 | |
id3 := 1 | |
e1 := Employee { | |
firstName: "Anjana", | |
secondName: "Shankar", | |
id: &id1, | |
} | |
e2 := Employee { | |
firstName: "Anjana", | |
secondName: "Shankar", | |
id: &id2, | |
} | |
e3 := Employee { | |
firstName: "Anjana", | |
secondName: "Shan", | |
id: &id3, | |
} | |
fmt.Println("== Operator in practice") | |
if e1 == e2 { | |
fmt.Println("e1 == e2") | |
} else { | |
fmt.Println("e1 != e2") | |
} | |
if e2 == e3 { | |
fmt.Println("e2 == e3") | |
} else { | |
fmt.Println("e2 != e3") | |
} | |
fmt.Println("DeepEqual() in practice") | |
fmt.Println("Is e1 equal to e2 : ", reflect.DeepEqual(e1, e2)) | |
fmt.Println("Is e2 equal to e3 : ", reflect.DeepEqual(e2, e3)) | |
} |
Also published on Educative