Project Organization and Style
Dependency Direction
Packages stay easier to test when higher-level layers depend on lower-level interfaces deliberately.
Dependency Direction
dependency_direction.go
package main
import "fmt"
func main() {
var layer =
allowed := map[string][]string{
"handler": {"domain", "log"},
"domain": {"time"},
"storage": {"domain", "database/sql"},
}
dependencies := allowed[layer]
stable := layer != "domain" || len(dependencies) == 1
fmt.Println("layer=", layer)
fmt.Println("dependency_count=", len(dependencies))
for _, dependency := range dependencies {
fmt.Println("depends_on=", dependency)
}
fmt.Println("stable_core=", stable)
}
package main
import "fmt"
func main() {
var layer =
allowed := map[string][]string{
"handler": {"domain", "log"},
"domain": {"time"},
"storage": {"domain", "database/sql"},
}
dependencies := allowed[layer]
stable := layer != "domain" || len(dependencies) == 1
fmt.Println("layer=", layer)
fmt.Println("dependency_count=", len(dependencies))
for _, dependency := range dependencies {
fmt.Println("depends_on=", dependency)
}
fmt.Println("stable_core=", stable)
}
package main
import "fmt"
func main() {
var layer =
allowed := map[string][]string{
"handler": {"domain", "log"},
"domain": {"time"},
"storage": {"domain", "database/sql"},
}
dependencies := allowed[layer]
stable := layer != "domain" || len(dependencies) == 1
fmt.Println("layer=", layer)
fmt.Println("dependency_count=", len(dependencies))
for _, dependency := range dependencies {
fmt.Println("depends_on=", dependency)
}
fmt.Println("stable_core=", stable)
}
dependency direction
Track which layer owns a dependency so imports do not grow into cycles.