2.1 #1: Unintended variable shadowing2.2 #2: Unnecessary nested code2.3 #3: Misusing init functions2.3.1 Concepts2.3.2 When to use init functions2.4 #4: Overusing getters and setters2.5 #5: Interface pollution2.5.1 Concepts2.5.2 When to use interfaces2.5.3 Interface pollution2.6 #6: Interface on the producer side2.7 #7: Returning interfaces2.8 #8: any says nothing2.9 #9: Being confused about when to use generics2.9.1 Concepts2.9.2 Common uses and misuses2.10 #10: Not being aware of the possible problems with type embedding2.11 #11: Not using the functional options pattern2.11.1 Config struct2.11.2 Builder pattern2.11.3 Functional options pattern2.12 #12: Project misorganization2.12.1 Project structure2.12.2 Package organization2.13 #13: Creating utility packages2.14 #14: Ignoring package name collisions2.15 #15: Missing code documentation2.16 #16: Not using lintersSummary