Skip to Content
Go Realm v1 is released 🎉
TopicsStruct

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)

  1. āϤ⧁āϞāύāĻž (Equality): āĻ¸ā§āĻŸā§āϰāĻžāĻ•ā§āĻŸā§‡āϰ āϏāĻŦ āĻĢāĻŋāĻ˛ā§āĻĄ āϝāĻĻāĻŋ comparable (āϝ⧇āĻŽāύ int, string) āĻšā§Ÿ, āϤāĻŦ⧇āχ == āĻĻāĻŋā§Ÿā§‡ āϤ⧁āϞāύāĻž āĻ•āϰāĻž āϝāĻžā§ŸāĨ¤ Slice āĻŦāĻž Map āĻĨāĻžāĻ•āϞ⧇ == āĻ•āĻžāϜ āĻ•āϰāĻŦ⧇ āύāĻžāĨ¤

  2. 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") } }
  1. Memory: āĻŦ⧜ āĻ¸ā§āĻŸā§āϰāĻžāĻ•ā§āϟ āĻĢāĻžāĻ‚āĻļāύ⧇ āĻĒāĻžāϏ āĻ•āϰāĻžāϰ āϏāĻŽā§Ÿ Pointer āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ, āĻāϤ⧇ āĻŽā§‡āĻŽā§‹āϰāĻŋ āĻŦāĻžāρāĻšā§‡ (āĻĒ⧁āϰ⧋ āĻ¸ā§āĻŸā§āϰāĻžāĻ•ā§āϟ āĻ•āĻĒāĻŋ āĻšā§Ÿ āύāĻž)āĨ¤