Go Structs
Go āϞā§āϝāĻžāĻā§āĻā§ā§ā§āĻā§ āĻĄā§āĻāĻž āĻŽāĻĄā§āϞāĻŋāĻ āĻāĻŦāĻ āĻ āϰā§āĻāĻžāύāĻžāĻāĻ āĻāϰāĻžāϰ āĻŽā§āϰā§āĻĻāĻŖā§āĻĄ āĻšāϞ⧠āϏā§āĻā§āϰāĻžāĻā§āĻāĨ¤
ā§§. āϏā§āĻā§āϰāĻžāĻā§āĻ āĻā§?
āϏā§āĻā§āϰāĻžāĻā§āĻ āĻšāϞ⧠āĻāĻāĻāĻŋ āĻāĻžāϏā§āĻāĻŽ āĻĄā§āĻāĻž āĻāĻžāĻāĻĒ, āϝāĻž āĻŦāĻŋāĻāĻŋāύā§āύ āϧāϰāĻŖā§āϰ āĻĄā§āĻāĻžāĻā§ āĻāĻāĻāĻŋ āĻā§āϝāĻžāϰāĻŋā§ā§āĻŦāϞā§āϰ āĻŦāĻž āĻĒā§āϝāĻžāĻā§āϰ āĻā§āϤāϰ āϰāĻžāĻā§āĨ¤ āĻāĻā§ āĻāĻĒāύāĻŋ āĻĄā§āĻāĻžāĻŦā§āϏā§āϰ āĻā§āĻŦāĻŋāϞ āĻŦāĻž āĻ āύā§āϝāĻžāύā§āϝ āϞā§āϝāĻžāĻā§āĻā§ā§ā§āĻā§āϰ āĻā§āϞāĻžāϏ (Class)-āĻāϰ āϏāĻžāĻĨā§ āϤā§āϞāύāĻž āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ (āϝāĻĻāĻŋāĻ Go-āϤ⧠āĻā§āϞāĻžāϏ āύā§āĻ)āĨ¤
A struct is a collection of members of different data types into a single variable.
⧍. āϏā§āĻā§āϰāĻžāĻā§āĻ āϤā§āϰāĻŋ āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ
package main
import "fmt"
type Person struct {
Name string
Age int
Salary int
}
func main() {
// ā§§. āϏāĻžāϧāĻžāϰāĻŖ āύāĻŋā§āĻŽ
var p1 Person
p1.Name = "Rahim"
p1.Age = 30
// ⧍. struct literal (āϏāĻŦāĻā§ā§ā§ āĻŦā§āĻļāĻŋ āĻŦā§āϝāĻŦāĻšā§āϤ)
p2 := Person{
Name: "Karim",
Age: 25,
Salary: 40000,
}
fmt.Println(p1, p2)
}
ā§Š. Exported vs Unexported (Visibility) đĨ
Go āĻĄā§āĻā§āϞāĻĒāĻŽā§āύā§āĻā§ āĻāĻāĻŋ āĻŦā§āĻāĻž āϏāĻŦāĻā§ā§ā§ āĻāϰā§āϰāĻŋāĨ¤ Go-āϤ⧠public āĻŦāĻž private āĻāĻŋāĻā§āĻžāϰā§āĻĄ āύā§āĻāĨ¤ āĻ
āĻā§āώāϰā§āϰ āĻā§āϏ (Case) āĻĻāĻŋā§ā§ āĻāĻāĻŋ āύāĻŋā§āύā§āϤā§āϰāĻŖ āĻāϰāĻž āĻšā§āĨ¤
- āĻŦā§ āĻšāĻžāϤā§āϰ āĻ
āĻā§āώāϰ (Uppercase): āϝāĻĻāĻŋ āĻĢāĻŋāϞā§āĻĄā§āϰ āύāĻžāĻŽā§āϰ āĻĒā§āϰāĻĨāĻŽ āĻ
āĻā§āώāϰ āĻŦā§ āĻšāĻžāϤā§āϰ āĻšā§ (āϝā§āĻŽāύ
Name), āϤāĻŦā§ āĻāĻāĻŋ Exported (Public)āĨ¤ āĻ āύā§āϝ āĻĒā§āϝāĻžāĻā§āĻ āĻĨā§āĻā§ āĻāĻāĻŋ āĻāĻā§āϏā§āϏ āĻāϰāĻž āϝāĻžāĻŦā§āĨ¤ - āĻā§āĻ āĻšāĻžāϤā§āϰ āĻ
āĻā§āώāϰ (Lowercase): āϝāĻĻāĻŋ āĻĒā§āϰāĻĨāĻŽ āĻ
āĻā§āώāϰ āĻā§āĻ āĻšāĻžāϤā§āϰ āĻšā§ (āϝā§āĻŽāύ
name), āϤāĻŦā§ āĻāĻāĻŋ Unexported (Private)āĨ¤ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āύāĻŋāĻā§āϰ āĻĒā§āϝāĻžāĻā§āĻā§āϰ āĻā§āϤāϰ āĻāĻāĻŋ āĻĻā§āĻāĻž āϝāĻžāĻŦā§āĨ¤
type User struct {
Username string // Public: āĻ
āύā§āϝ āĻĒā§āϝāĻžāĻā§āĻ āĻĨā§āĻā§ āĻĻā§āĻāĻž āϝāĻžāĻŦā§
password string // Private: āĻŦāĻžāĻāϰā§āϰ āĻĒā§āϝāĻžāĻā§āĻ āĻĨā§āĻā§ āĻĻā§āĻāĻž āϝāĻžāĻŦā§ āύāĻž (Security)
}
ā§Ē. āĻāύāϏā§āĻā§āϰāĻžāĻā§āĻāϰ āĻĒā§āϝāĻžāĻāĻžāϰā§āύ (Constructor Pattern) đĨ
āĻ
āύā§āϝ āϞā§āϝāĻžāĻā§āĻā§ā§ā§āĻā§ constructor āĻĨāĻžāĻā§, āĻāĻŋāύā§āϤ⧠Go-āϤ⧠āύā§āĻāĨ¤ āĻāύā§āĻĄāĻžāϏā§āĻā§āϰāĻŋāϤ⧠āĻāĻŽāϰāĻž āϏāĻžāϧāĻžāϰāĻŖāϤ āĻāĻāĻāĻŋ āĻĢāĻžāĻāĻļāύ āĻŦāĻžāύāĻŋā§ā§ āĻāĻ āĻāĻžāĻ āĻāϰāĻŋ, āϝāĻžāϰ āύāĻžāĻŽ āϏāĻžāϧāĻžāϰāĻŖāϤ New āĻĻāĻŋā§ā§ āĻļā§āϰ⧠āĻšā§āĨ¤ āĻāĻāĻŋ āĻāĻāĻāĻŋ Best PracticeāĨ¤
type Employee struct {
Name string
Role string
}
// āĻāĻāĻŋ āĻāύāϏā§āĻā§āϰāĻžāĻā§āĻāϰā§āϰ āĻŽāϤ⧠āĻāĻžāĻ āĻāϰāĻā§
func NewEmployee(name string) *Employee {
return &Employee{
Name: name,
Role: "Junior Developer", // āĻĄāĻŋāĻĢāϞā§āĻ āĻā§āϝāĻžāϞ⧠āϏā§āĻ āĻāϰāĻž āϝāĻžā§
}
}
func main() {
// āĻ
āĻŦāĻā§āĻā§āĻ āϤā§āϰāĻŋāϰ āϏā§āĻā§āϝāĻžāύā§āĻĄāĻžāϰā§āĻĄ āĻāĻĒāĻžā§
emp := NewEmployee("Siam")
fmt.Println(emp)
}
ā§Ģ. āύā§āϏā§āĻā§āĻĄ āϏā§āĻā§āϰāĻžāĻā§āĻ (Nested Structs)
āĻāĻāĻāĻŋ āϏā§āĻā§āϰāĻžāĻā§āĻā§āϰ āĻĢāĻŋāϞā§āĻĄ āĻšāĻŋāϏā§āĻŦā§ āĻ āύā§āϝ āĻāĻāĻāĻŋ āϏā§āĻā§āϰāĻžāĻā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāĻā§ Nested Struct āĻŦāϞā§āĨ¤ āϰāĻŋā§ā§āϞ āϞāĻžāĻāĻĢ āĻĒā§āϰāĻā§āĻā§āĻā§ āĻāĻāĻŋ āĻā§āĻŦ āĻŦā§āĻļāĻŋ āĻŦā§āϝāĻŦāĻšā§āϤ āĻšā§āĨ¤
type Address struct {
City, Country string
}
type Person struct {
Name string
Address Address // Nested Struct
}
func main() {
p := Person{
Name: "Alice",
Address: Address{
City: "Dhaka",
Country: "Bangladesh",
},
}
// āĻāĻā§āϏā§āϏ āĻāϰāĻž: āĻĄāĻ āĻ
āĻĒāĻžāϰā§āĻāϰ āĻā§āĻāύ āĻāϰ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻšā§
fmt.Println(p.Address.City) // Output: Dhaka
}
ā§Ŧ. āϏā§āĻā§āϰāĻžāĻā§āĻ āĻŽā§āĻĨāĻĄ āĻ āϰāĻŋāϏāĻŋāĻāĻžāϰ (Methods & Receivers)
Go-āϤ⧠āĻā§āϞāĻžāϏā§āϰ āĻŦāĻĻāϞ⧠āϏā§āĻā§āϰāĻžāĻā§āĻā§āϰ āϏāĻžāĻĨā§ āĻĢāĻžāĻāĻļāύ āĻŦāĻž āĻŽā§āĻĨāĻĄ āϝā§āĻā§āϤ āĻāϰāĻž āĻšā§ āĨ¤ āĻŽā§āĻĨāĻĄ āĻĄāĻŋāĻĢāĻžāĻāύ āĻāϰāĻžāϰ āϏāĻŽā§ āϰāĻŋāϏāĻŋāĻāĻžāϰ āĻ āĻŋāĻ āĻāϰāĻž āĻā§āĻŦ āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖāĨ¤
-
Value Receiver
(p Person): āĻāĻāĻŋ āϏā§āĻā§āϰāĻžāĻā§āĻā§āϰ āĻāĻāĻāĻŋ āĻāĻĒāĻŋ āύāĻŋā§ā§ āĻāĻžāĻ āĻāϰā§āĨ¤ āĻŽā§āĻĨāĻĄā§āϰ āĻā§āϤāϰ⧠āĻā§āύ⧠āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰāϞ⧠āĻāϏāϞ āϏā§āĻā§āϰāĻžāĻā§āĻā§ āĻĒā§āϰāĻāĻžāĻŦ āĻĒā§ā§ āύāĻž āĨ¤ -
Pointer Receiver
(p *Person): āĻāĻāĻŋ āĻāϏāϞ āϏā§āĻā§āϰāĻžāĻā§āĻāĻāĻŋ āύāĻŋā§ā§ āĻāĻžāĻ āĻāϰā§āĨ¤ āĻāĻāĻžāύ⧠āĻĢāĻŋāϞā§āĻĄā§āϰ āĻŽāĻžāύ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰāϞ⧠āĻāϏāϞ āϏā§āĻā§āϰāĻžāĻā§āĻā§āĻ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻšā§ āĨ¤
type Rectangle struct {
width, height float64
}
// Value Receiver: āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻšāĻŋāϏāĻžāĻŦ āĻāϰāĻžāϰ āĻāύā§āϝ
func (r Rectangle) Area() float64 {
return r.width * r.height
}
// Pointer Receiver: āϏā§āĻā§āϰāĻžāĻā§āĻā§āϰ āĻĄā§āĻāĻž āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰāĻžāϰ āĻāύā§āϝ
func (r *Rectangle) Scale(factor float64) {
r.width = r.width * factor // āĻŽā§āĻāύ āϏā§āĻā§āϰāĻžāĻā§āĻā§āϰ āĻŽāĻžāύ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻšāĻŦā§
r.height = r.height * factor
}
ā§. āϏā§āĻā§āϰāĻžāĻā§āĻ āĻāĻŽā§āĻŦā§āĻĄāĻŋāĻ (Inheritance-āĻāϰ āĻŦāĻŋāĻāϞā§āĻĒ)
Go-āϤ⧠āĻāύāĻšā§āϰāĻŋāĻā§āύā§āϏ āύā§āĻ, āϤāĻŦā§ Composition āĻŦāĻž āĻāĻŽā§āĻŦā§āĻĄāĻŋāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻŽāϰāĻž āĻā§āĻĄ āϰāĻŋ-āĻāĻāĻ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋāĨ¤ āĻāĻāĻāĻŋ āϏā§āĻā§āϰāĻžāĻā§āĻāĻā§ āĻ āύā§āϝ āϏā§āĻā§āϰāĻžāĻā§āĻā§āϰ āĻā§āϤāϰ āϏāϰāĻžāϏāϰāĻŋ āĻĸā§āĻāĻŋā§ā§ āĻĻā§āĻā§āĻž āϝāĻžā§ āĨ¤
type Author struct {
FirstName string
LastName string
}
type Book struct {
Title string
Author // Embedding: āĻāĻāĻžāύ⧠āĻā§āύ⧠āĻĢāĻŋāϞā§āĻĄ āύāĻžāĻŽ āĻĻā§āĻā§āĻž āĻšā§āύāĻŋ
}
func main() {
b := Book{
Title: "Go Programming",
Author: Author{FirstName: "John", LastName: "Doe"},
}
// Promoted Field: āϏāϰāĻžāϏāϰāĻŋ āĻĒā§āϝāĻžāϰā§āύā§āĻ āĻĢāĻŋāϞā§āĻĄ āĻāĻā§āϏā§āϏ āĻāϰāĻž āϝāĻžā§!
fmt.Println(b.FirstName) // b.Author.FirstName āϞā§āĻāĻžāϰ āĻĻāϰāĻāĻžāϰ āύā§āĻ
}
ā§Ž. āĻ ā§āϝāĻžāύā§āύāĻŋāĻŽāĻžāϏ āϏā§āĻā§āϰāĻžāĻā§āĻ (Anonymous Structs)
āĻŽāĻžāĻā§ āĻŽāĻžāĻā§ āĻāĻĒāύāĻžāϰ āĻāĻŽāύ āĻāĻāĻāĻŋ āϏā§āĻā§āϰāĻžāĻā§āĻ āĻĻāϰāĻāĻžāϰ āĻšāϤ⧠āĻĒāĻžāϰ⧠āϝāĻž āĻāĻĒāύāĻŋ āĻļā§āϧ⧠āĻāĻāĻŦāĻžāϰāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦā§āύāĨ¤ āϏā§āĻā§āώā§āϤā§āϰ⧠āĻāϞāĻžāĻĻāĻž āĻāĻžāĻāĻĒ āϤā§āϰāĻŋ āύāĻž āĻāϰ⧠āĻ ā§āϝāĻžāύā§āύāĻŋāĻŽāĻžāϏ āϏā§āĻā§āϰāĻžāĻā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻšā§ āĨ¤ āĻāĻāĻŋ āĻĻā§āϰā§āϤ āĻāĻŦāĻ āĻā§āĻŽā§āĻĒā§āϰāĻžāϰāĻŋ āĻāĻžāĻā§āϰ āĻāύā§āϝ āĻā§āĻŦ āĻāĻžāϞ⧠āĨ¤
// āĻāĻžāĻāĻĒ āĻĄāĻŋāĻĢāĻžāĻāύ āĻāĻžā§āĻžāĻ āϏāϰāĻžāϏāϰāĻŋ āϏā§āĻā§āϰāĻžāĻā§āĻ āϤā§āϰāĻŋ
data := struct {
Title string
Code int
}{
Title: "Success",
Code: 200,
}
⧝. JSON āĻā§āϝāĻžāĻāϏ (Web Dev-āĻāϰ āĻāύā§āϝ āĻāϰā§āϰāĻŋ)
API āϤā§āϰāĻŋāϰ āϏāĻŽā§ āϏā§āĻā§āϰāĻžāĻā§āĻ āĻĢāĻŋāϞā§āĻĄ āĻāĻŦāĻ JSON āĻāĻŋ (Key)-āĻāϰ āύāĻžāĻŽ āĻāϞāĻžāĻĻāĻž āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻāύā§āϝ Tags āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻšā§āĨ¤
type Product struct {
ID int `json:"product_id"` // JSON āĻ "product_id" āĻĻā§āĻāĻžāĻŦā§
Name string `json:"name,omitempty"` // āĻā§āϝāĻžāϞ⧠āύāĻž āĻĨāĻžāĻāϞ⧠āĻĢāĻŋāϞā§āĻĄ āĻšāĻžāĻāĻĄ āĻāϰāĻŦā§
Price float64 `json:"-"` // āĻāĻ āĻĢāĻŋāϞā§āĻĄāĻāĻŋ āĻāĻāύā§āĻ JSON āĻ āϝāĻžāĻŦā§ āύāĻž (Security)
}
ā§§ā§Ļ. āĻŽāύ⧠āϰāĻžāĻāĻžāϰ āĻŽāϤ⧠āĻāĻŋāĻĒāϏ (Best Practices)
-
āϤā§āϞāύāĻž (Equality): āϏā§āĻā§āϰāĻžāĻā§āĻā§āϰ āϏāĻŦ āĻĢāĻŋāϞā§āĻĄ āϝāĻĻāĻŋ
comparable(āϝā§āĻŽāύ int, string) āĻšā§, āϤāĻŦā§āĻ==āĻĻāĻŋā§ā§ āϤā§āϞāύāĻž āĻāϰāĻž āϝāĻžā§āĨ¤ Slice āĻŦāĻž Map āĻĨāĻžāĻāϞā§==āĻāĻžāĻ āĻāϰāĻŦā§ āύāĻžāĨ¤ -
Nil Pointer: āϏā§āĻā§āϰāĻžāĻā§āĻ āĻĒā§ā§āύā§āĻāĻžāϰ āϝāĻĻāĻŋ
nilāĻšā§, āϤāĻŦā§ āϤāĻžāϰ āĻĢāĻŋāϞā§āĻĄ āĻāĻā§āϏā§āϏ āĻāϰāϞ⧠āĻā§āĻĄ āĻā§āϰā§āϝāĻžāĻļ āĻāϰāĻŦā§āĨ¤ āϤāĻžāĻ āĻĒā§ā§āύā§āĻāĻžāϰ āϰāĻŋāϏāĻŋāĻ āĻāϰāĻžāϰ āĻāĻā§ āĻā§āĻ āĻāϰ⧠āύāĻŋāύāĨ¤
type Book struct {
title string
}
func main() {
var b *Book // āĻāĻāĻŋ āĻāĻāύ nil
if b != nil {
fmt.Println(b.title)
} else {
fmt.Println("Book is nil")
}
}
- Memory: āĻŦā§ āϏā§āĻā§āϰāĻžāĻā§āĻ āĻĢāĻžāĻāĻļāύ⧠āĻĒāĻžāϏ āĻāϰāĻžāϰ āϏāĻŽā§
PointerāĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύ, āĻāϤ⧠āĻŽā§āĻŽā§āϰāĻŋ āĻŦāĻžāĻāĻā§ (āĻĒā§āϰ⧠āϏā§āĻā§āϰāĻžāĻā§āĻ āĻāĻĒāĻŋ āĻšā§ āύāĻž)āĨ¤