Data Modeling Patterns
Embedding Methods
Embedded structs promote fields and methods while keeping the composed pieces visible.
embedding
Embed a small struct when a larger model should reuse its fields and methods directly.
Embedding Methods
embedding_methods.go
Replay: real traced execution (multi-file project)
package main
import "fmt"
type User struct {
Name string
}
func (u User) Label() string {
return u.Name
}
type Admin struct {
User
Level int
}
func main() {
var elevated = false
admin := Admin{User: User{Name: "Ada"}, Level: 1}
if elevated {
admin.Level = 3
}
label := admin.Label()
canDeploy := admin.Level >= 3
fmt.Println("label=", label)
fmt.Println("level=", admin.Level)
fmt.Println("can_deploy=", canDeploy)
}
package main
import "fmt"
type User struct {
Name string
}
func (u User) Label() string {
return u.Name
}
type Admin struct {
User
Level int
}
func main() {
var elevated = true
admin := Admin{User: User{Name: "Ada"}, Level: 1}
if elevated {
admin.Level = 3
}
label := admin.Label()
canDeploy := admin.Level >= 3
fmt.Println("label=", label)
fmt.Println("level=", admin.Level)
fmt.Println("can_deploy=", canDeploy)
}
elevated ← false, admin ← main.Admin{User:main.User{Name:"Ada"}, Level:1}
18func main() {19 var elevated→ false = false //@elevated=true20 admin→ main.Admin{User:main.User{Name:"Ada"}, Level:1} := Admin{User: User{Name: "Ada"}, Level: 1}21 if elevated {22 admin.Level = 323 }2425 label := adminmain.Admin{User:main.User{Name:"Ada"}, Level:1}.Label()26 canDeploy := admin.Level >= 3func (u User) Label() string
9func (u User) Label() string {10 return u.Name"Ada"11}label ← "Ada", canDeploy ← false
25 label→ "Ada" := adminmain.Admin{User:main.User{Name:"Ada"}, Level:1}.Label()26 canDeploy→ false := admin.Level1 >= 32728 fmt.Println("label=", label"Ada")29 fmt.Println("level=", admin.Level1)30 fmt.Println("can_deploy=", canDeployfalse)31}outputlabel= Ada level= 1 can_deploy= false
elevated ← true, admin ← main.Admin{User:main.User{Name:"Ada"}, Level:1}
18func main() {19 var elevated→ true = true20 admin→ main.Admin{User:main.User{Name:"Ada"}, Level:1} := Admin{User: User{Name: "Ada"}, Level: 1}21 if elevated {admin.Level ← 3
20admin := Admin{User: User{Name: "Ada"}, Level: 1}21if elevatedtrue {22 admin.Level→ 3 = 323}label := admin.Label()
25label := adminmain.Admin{User:main.User{Name:"Ada"}, Level:3}.Label()26canDeploy := admin.Level >= 3func (u User) Label() string
9func (u User) Label() string {10 return u.Name"Ada"11}label ← "Ada", canDeploy ← true
25 label→ "Ada" := adminmain.Admin{User:main.User{Name:"Ada"}, Level:3}.Label()26 canDeploy→ true := admin.Level3 >= 32728 fmt.Println("label=", label"Ada")29 fmt.Println("level=", admin.Level3)30 fmt.Println("can_deploy=", canDeploytrue)31}outputlabel= Ada level= 3 can_deploy= true