Structs help you group related data together in one place. They make your code organized and easy to understand.
When you want to represent a real-world object like a person or a car with multiple details.
When you need to pass multiple related values together in functions.
When you want to create reusable blueprints for data with different values.
When you want to group settings or configurations in one variable.
When you want to improve code readability by naming groups of data.
Syntax
Go
type StructName struct {
Field1 FieldType1
Field2 FieldType2
// more fields
}
Use type keyword to define a new struct type.
Each field has a name and a type, separated by space.
Examples
This defines a Person struct with two fields: Name and Age.
Go
type Person struct {
Name string
Age int
}
This defines a Point struct with two integer fields X and Y on one line.
Go
type Point struct {
X, Y int
}
This creates a new Person value with Name set to "Alice" and Age set to 30.
Go
p := Person{Name: "Alice", Age: 30}
This declares a Person variable and sets its fields one by one.
Go
var p Person
p.Name = "Bob"
p.Age = 25
Sample Program
This program shows how to define a Car struct, create values, and access their fields.
Go
package main
import"fmt"
type Car struct {
Brand string
Year int
}
func main() {
myCar := Car{Brand: "Toyota", Year: 2020}
fmt.Println("My car brand is", myCar.Brand)
fmt.Println("It was made in", myCar.Year)
var oldCar Car
oldCar.Brand = "Ford"
oldCar.Year = 1995
fmt.Println("Old car brand:", oldCar.Brand)
fmt.Println("Old car year:", oldCar.Year)
}
OutputSuccess
Important Notes
You can create structs with or without field names when initializing.
Structs can be nested inside other structs for complex data.
Use pointers to structs if you want to modify the original data inside functions.
Summary
Structs group related data with named fields.
Use structs to model real-world things or organize data.
You can create, access, and modify struct fields easily.
Practice
(1/5)
1. What is the primary purpose of using a struct in Go?
easy
A. To group related data with named fields
B. To perform arithmetic operations
C. To create loops
D. To handle errors
Solution
Step 1: Understand the role of structs
Structs are used to group related data together in one unit with named fields.
Step 2: Compare with other options
Arithmetic, loops, and error handling are not the main purposes of structs.
Final Answer:
To group related data with named fields -> Option A
Quick Check:
Structs = Group related data [OK]
Hint: Structs group data fields logically [OK]
Common Mistakes:
Thinking structs are for control flow
Confusing structs with functions
Assuming structs handle errors
2. Which of the following is the correct way to declare a struct type named Person with fields Name (string) and Age (int)?
easy
A. Person := struct { Name string; Age int }
B. struct Person { Name string; Age int }
C. var Person struct Name string; Age int
D. type Person struct { Name string; Age int }
Solution
Step 1: Recall Go struct declaration syntax
In Go, a struct type is declared with the keyword type, followed by the name, then struct and fields inside braces.
Step 2: Check each option
type Person struct { Name string; Age int } matches the correct syntax. struct Person { Name string; Age int } misses type. Person := struct { Name string; Age int } uses := which is for variables, not type declaration. var Person struct Name string; Age int is invalid syntax.
Final Answer:
type Person struct { Name string; Age int } -> Option D
Quick Check:
Struct declaration uses 'type Name struct { fields }' [OK]
Hint: Use 'type Name struct { fields }' to declare structs [OK]
Common Mistakes:
Omitting 'type' keyword
Using := for type declaration
Incorrect field syntax
3. What will be the output of the following Go code?
type Point struct {
X int
Y int
}
func main() {
p := Point{X: 3, Y: 4}
p.X = 10
fmt.Println(p.X, p.Y)
}
medium
A. 10 4
B. 3 4
C. 10 0
D. 0 4
Solution
Step 1: Understand struct initialization and modification
The struct Point is initialized with X=3 and Y=4. Then p.X is changed to 10.
Step 2: Determine printed values
After modification, p.X is 10 and p.Y remains 4. So printing p.X and p.Y outputs '10 4'.
Final Answer:
10 4 -> Option A
Quick Check:
Modified field prints updated value [OK]
Hint: Changing struct fields updates their values [OK]
Common Mistakes:
Assuming original values stay after assignment
Confusing field names
Forgetting to import fmt (not shown here)
4. Identify the error in the following Go code snippet:
type Car struct {
Brand string
Year int
}
func main() {
c := Car{Brand: "Toyota", Year: "2020"}
fmt.Println(c)
}
medium
A. Missing semicolon after struct declaration
B. Year field assigned a string instead of int
C. Incorrect struct name capitalization
D. fmt.Println cannot print structs
Solution
Step 1: Check field types in struct literal
The struct Car has Year as int, but the code assigns "2020" (a string) to Year.
Step 2: Verify other options
Semicolons are optional in Go. Struct name capitalization is fine. fmt.Println can print structs.
Final Answer:
Year field assigned a string instead of int -> Option B
Quick Check:
Field types must match assigned values [OK]
Hint: Match struct field types exactly when assigning [OK]
Common Mistakes:
Assigning wrong data types to fields
Thinking semicolons are mandatory
Assuming fmt.Println can't print structs
5. Given a struct type Employee with fields Name (string), Salary (int), and Active (bool), which code snippet correctly creates a slice of active employees with salary over 50000 from a given slice emps?
hard
A. filtered := make([]Employee, 0)
for _, e := range emps {
if e.Active || e.Salary > 50000 {
filtered = append(filtered, e)
}
}
B. filtered := []Employee{}
for i := 0; i < len(emps); i++ {
if emps[i].Salary > 50000 {
filtered = append(filtered, emps[i])
}
}
C. var filtered []Employee
for _, e := range emps {
if e.Active && e.Salary > 50000 {
filtered = append(filtered, e)
}
}
D. filtered := []Employee{}
for _, e := range emps {
if e.Active && e.Salary < 50000 {
filtered = append(filtered, e)
}
}
Solution
Step 1: Understand filtering conditions
We want employees who are active AND have salary greater than 50000.
Step 2: Analyze each option's condition
var filtered []Employee
for _, e := range emps {
if e.Active && e.Salary > 50000 {
filtered = append(filtered, e)
}
} uses correct AND condition. filtered := []Employee{}
for i := 0; i < len(emps); i++ {
if emps[i].Salary > 50000 {
filtered = append(filtered, emps[i])
}
} misses Active check. filtered := make([]Employee, 0)
for _, e := range emps {
if e.Active || e.Salary > 50000 {
filtered = append(filtered, e)
}
} uses OR instead of AND. filtered := []Employee{}
for _, e := range emps {
if e.Active && e.Salary < 50000 {
filtered = append(filtered, e)
}
} uses salary less than 50000, which is wrong.
Final Answer:
var filtered []Employee
for _, e := range emps {
if e.Active && e.Salary > 50000 {
filtered = append(filtered, e)
}
} -> Option C
Quick Check:
Use AND (&&) for combined conditions [OK]
Hint: Use && to combine multiple filter conditions [OK]
Common Mistakes:
Using || instead of && for filtering
Ignoring one of the filter conditions
Filtering with wrong comparison operators
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.