Practical Usage Patterns
Design Patterns for Struct Visibility
Golang provides powerful mechanisms for managing struct visibility through strategic design patterns and architectural approaches.
Common Usage Patterns
graph TD
A[Struct Visibility Patterns] --> B[Encapsulation]
A --> C[Interface Abstraction]
A --> D[Composition]
A --> E[Factory Methods]
1. Encapsulation Pattern
type DatabaseConfig struct {
host string
port int
username string
password string
}
func NewDatabaseConfig(host string, port int) *DatabaseConfig {
return &DatabaseConfig{
host: host,
port: port,
}
}
func (dc *DatabaseConfig) SetCredentials(username, password string) {
dc.username = username
dc.password = password
}
2. Interface Abstraction
type DataStore interface {
Save(data interface{}) error
Retrieve(key string) (interface{}, error)
}
type MemoryStore struct {
storage map[string]interface{}
}
func (ms *MemoryStore) Save(data interface{}) error {
// Implementation details
}
func (ms *MemoryStore) Retrieve(key string) (interface{}, error) {
// Implementation details
}
Visibility Strategies
Strategy |
Description |
Use Case |
Private Fields |
Restrict direct access |
Sensitive data |
Public Methods |
Controlled interaction |
Data manipulation |
Interface Contracts |
Define behavior |
Dependency injection |
3. Composition and Embedding
type BaseModel struct {
ID string
CreatedAt time.Time
}
type User struct {
BaseModel
Username string
Email string
}
type Admin struct {
User
Permissions []string
}
4. Factory Method Pattern
type ConfigBuilder struct {
config *ServiceConfig
}
func NewConfigBuilder() *ConfigBuilder {
return &ConfigBuilder{
config: &ServiceConfig{},
}
}
func (cb *ConfigBuilder) WithHost(host string) *ConfigBuilder {
cb.config.host = host
return cb
}
func (cb *ConfigBuilder) Build() *ServiceConfig {
return cb.config
}
LabEx Recommended Practices
- Minimize exposed struct fields
- Use constructor/factory methods
- Implement interface-based designs
- Leverage composition over inheritance
Advanced Visibility Control
type SecureService struct {
config *configuration
initialized bool
mu sync.Mutex
}
func (ss *SecureService) Initialize() error {
ss.mu.Lock()
defer ss.mu.Unlock()
if ss.initialized {
return errors.New("already initialized")
}
// Initialization logic
ss.initialized = true
return nil
}
Visibility Flow Diagram
graph LR
A[Struct Definition] --> B{Visibility Rules}
B -->|Public Methods| C[Controlled Access]
B -->|Private Fields| D[Data Protection]
C --> E[Safe Interaction]
D --> F[Encapsulation]
Key Takeaways
- Use visibility to create robust, maintainable code
- Implement strict access controls
- Leverage Go's type system for design flexibility
- Prioritize clear, predictable interfaces
This comprehensive approach demonstrates how to effectively manage struct visibility in real-world Golang applications.