What if you could turn a messy pile of data into a neat, easy-to-use package with just a few lines of code?
Why Defining structs in Go? - Purpose & Use Cases
Imagine you want to keep track of many people's information like their name, age, and address. Writing separate variables for each person and each detail quickly becomes messy and confusing.
Manually managing many related pieces of data means lots of repeated code, easy mistakes, and difficulty updating or organizing information. It's like trying to carry many loose papers instead of a neat folder.
Defining structs lets you bundle related data into one neat package. This makes your code cleaner, easier to read, and simpler to manage, just like putting all papers about one person into a single folder.
var name1 string var age1 int var name2 string var age2 int
type Person struct {
Name string
Age int
}
var p1 Person
var p2 PersonIt enables you to organize complex data clearly and work with groups of related information easily and safely.
Think of a contact list app where each contact has a name, phone number, and email. Using structs, you can store each contact's details together and manage the whole list smoothly.
Structs group related data into one unit.
This reduces errors and makes code easier to understand.
Structs help organize and manage complex information clearly.
Practice
struct in Go?Solution
Step 1: Understand the role of structs
Structs are used to group related data fields together in one unit, like a blueprint for an object.Step 2: Compare with other options
Functions, packages, and imports serve different purposes unrelated to grouping data.Final Answer:
To group related data fields into a single unit -> Option BQuick Check:
Struct = grouped data [OK]
- Confusing structs with functions
- Thinking structs declare packages
- Mixing structs with imports
Person with fields Name (string) and Age (int)?Solution
Step 1: Recall Go struct syntax
In Go, structs are defined using the syntax: type Name struct { fields }.Step 2: Check each option
type Person struct { Name string; Age int } matches the correct syntax. Options A, B, and C miss the 'type' keyword or 'struct' keyword placement.Final Answer:
type Person struct { Name string; Age int } -> Option CQuick Check:
Correct struct syntax = type Person struct { Name string; Age int } [OK]
- Omitting 'type' keyword
- Missing 'struct' keyword
- Incorrect order of keywords
package main
import "fmt"
type Car struct {
Brand string
Year int
}
func main() {
c := Car{Brand: "Toyota", Year: 2020}
fmt.Println(c.Brand)
}Solution
Step 1: Understand struct initialization
The struct Car is initialized with Brand="Toyota" and Year=2020.Step 2: Identify printed field
The code prints c.Brand, which is "Toyota".Final Answer:
Toyota -> Option DQuick Check:
Print c.Brand = Toyota [OK]
- Printing the whole struct instead of a field
- Confusing field names
- Expecting Year instead of Brand
package main
import "fmt"
type Book struct {
Title string
Pages int
}
func main() {
b := Book{Title: "Go Guide", Pages: "300"}
fmt.Println(b)
}Solution
Step 1: Check field types in struct initialization
The Pages field is declared as int but assigned a string "300" which is a type mismatch.Step 2: Verify other possible errors
Import for fmt package is present. Struct fields can be uppercase. Printing structs directly is allowed.Final Answer:
Pages field has wrong type, should be int not string -> Option AQuick Check:
Type mismatch in struct field assignment [OK]
- Assigning string to int field
- Expecting compilation error from printing struct
- Thinking struct fields must be lowercase
type Employee struct {
Name string
Salary int
Active bool
}
Which of the following code snippets correctly creates a slice of Employee structs with only active employees having salary above 50000?Solution
Step 1: Understand filtering criteria
We want only employees who are active and have salary above 50000.Step 2: Check each code snippet logic
emps := []Employee{{"Alice", 60000, true}, {"Bob", 45000, true}, {"Carol", 70000, false}} var filtered []Employee for _, e := range emps { if e.Active && e.Salary > 50000 { filtered = append(filtered, e) } } uses 'e.Active && e.Salary > 50000' which matches criteria. emps := []Employee{{"Alice", 60000, true}, {"Bob", 45000, true}, {"Carol", 70000, false}} filtered := []Employee{} for i := range emps { if emps[i].Salary > 50000 { filtered = append(filtered, emps[i]) } } misses active check. emps := []Employee{{"Alice", 60000, true}, {"Bob", 45000, true}, {"Carol", 70000, false}} filtered := []Employee{} for _, e := range emps { if e.Active || e.Salary > 50000 { filtered = append(filtered, e) } } uses '||' which includes inactive employees. emps := []Employee{{"Alice", 60000, true}, {"Bob", 45000, true}, {"Carol", 70000, false}} filtered := []Employee{} for _, e := range emps { if e.Active && e.Salary < 50000 { filtered = append(filtered, e) } } uses salary < 50000 which is wrong.Final Answer:
The code that filters using e.Active && e.Salary > 50000 -> Option AQuick Check:
Filter with '&&' for both conditions [OK]
- Using || instead of && for filtering
- Ignoring the Active field in filter
- Using wrong salary comparison operator
Ready to prove it?
Pass the test and this pattern moves unknown
