Go – Structs Explained with Syntax, Examples, and Best Practices (2025 Guide)
Introduction – What Are Structs in Go?
A struct in Go is a composite data type that groups together variables (called fields) under a single name. Structs are used to model real-world entities, custom data types, and record-like objects such as users, configurations, or responses.
In this section, you’ll learn:
- How to define and initialize structs
- Access and modify struct fields
- Use struct literals and pointers
- Best practices and struct comparisons
Define a Struct
type Person struct {
Name string
Age int
}
This defines a new Person type with two fields: Name and Age.
Initialize a Struct
Using Field Names
p1 := Person{Name: "Alice", Age: 30}
Positional (without field names)
p2 := Person{"Bob", 25}
Positional syntax depends on field order – not recommended for large structs.
Access and Modify Struct Fields
fmt.Println(p1.Name) // Output: Alice
p1.Age = 31
fmt.Println(p1.Age) // Output: 31
Use dot notation to access or modify fields.
Struct with Pointer
p := &Person{Name: "Charlie", Age: 40}
p.Age = 41 // Automatically dereferenced
fmt.Println(p.Name, p.Age)
Output:
Charlie 41
Go allows implicit dereferencing of struct pointers.
Struct Inside Struct (Nesting)
type Address struct {
City string
State string
}
type Employee struct {
Name string
Age int
Address Address
}
e := Employee{
Name: "John",
Age: 28,
Address: Address{
City: "Pune",
State: "MH",
},
}
Nesting allows hierarchical data modeling.
Anonymous Fields (Embedded Structs)
type Contact struct {
Phone string
}
type User struct {
Name string
Contact // Embedded struct
}
u := User{Name: "Eva", Contact: Contact{Phone: "123456"}}
fmt.Println(u.Phone) // Access without dot chain
Embedding promotes fields to outer struct – simulates inheritance.
Compare Structs
p1 := Person{"Tom", 20}
p2 := Person{"Tom", 20}
fmt.Println(p1 == p2) // Output: true
Go supports direct struct comparison if all fields are comparable.
Best Practices
| Tip | Why It Matters |
|---|---|
| Use named fields | Improves readability and maintainability |
| Use pointers for large structs | Avoids copying large memory blocks |
| Don’t use positional init | Risky with field order changes |
| Use embedded structs | For composition and reusability |
Summary – Recap & Next Steps
Go structs are the foundation of custom types in Go. They provide a way to encapsulate related fields and represent real-world models in a clean and efficient manner.
Key Takeaways:
- Structs group fields of different types
- Use dot notation to access fields
- Use pointers to avoid copying and enable mutation
- Support for nesting and embedding allows advanced data models
Next: Explore Methods on Structs, Struct Tags, or JSON Struct Encoding.
FAQs – Go Structs
Can I compare two structs directly in Go?
Yes, if all fields are comparable types.
What is the zero value of a struct?
All fields are initialized to their respective zero values.
How do I create a pointer to a struct?
Use &StructType{} or new(StructType).
Can I embed one struct into another?
Yes. It allows field promotion and composition.
Should I pass structs by value or by pointer?
Use pointers for large structs or when mutation is needed.
Share Now :
