Based on article: https://commandcenter.blogspot.com/2014/01/self-referential-functions-and-design.html?m=1
Full example: https://github.com/romanitalian/go-service-options
.
├── cmd
│ └── main.go
├── pkg
│ ├── accounts
│ │ └── service.go
│ ├── billing
│ │ └── service.go
│ └── subscriptions
│ └── service.go
└── README.md
package main import ( "../pkg/accounts" "../pkg/billing" "../pkg/subscriptions" "fmt" ) func main() { fmt.Println("## Variant1:") variant1() fmt.Println() fmt.Println("## Variant2:") variant2() fmt.Println() fmt.Println("## Variant3:") variant3() } func variant1() { foo := subscriptions.New() srvAccounts := accounts.New(8) ac := subscriptions.SrvAccounts(srvAccounts) foo.Option(ac) foo.Process(23) } func variant2() { foo := subscriptions.New() srvAccounts := accounts.New(8) srvBilling := billing.New() ac := subscriptions.SrvAccounts(srvAccounts) bl := subscriptions.SrvBilling(srvBilling) foo.Option(ac, bl) foo.Process(23) } func variant3() { foo := subscriptions.New() srvAccounts := accounts.New(8) srvBilling := billing.New() ac := subscriptions.SrvAccounts(srvAccounts) bl := subscriptions.SrvBilling(srvBilling) foo.Option(ac) foo.Option(bl) foo.Process(23) }