Ontwerp een efficiënte Go-module voor <functieomschrijving>
description
Met deze prompt kan de gebruiker een op maat gemaakte Go-module ontwerpen die voldoet aan specifieke functionele en niet-functionele eisen. Het helpt de gebruiker om idiomatische Go-code te schrijven, schaalbaarheid te waarborgen en een goede teststrategie te ontwikkelen, waardoor tijd wordt bespaard en de codekwaliteit verbetert.
prompt
Help me met het ontwerpen van een Go-module die <functieomschrijving> uitvoert. Mijn module moet rekening houden met <belangrijke_vereis ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Natuurlijk! Hier is een overzicht en advies voor het ontwerpen van een Go-module voor validatie en gegevenssanering met robuuste foutafhandeling, uitgebreide logging, idiomatische en schaalbare code, evenals test- en optimalisatieadvies.
1. Structuur van de Module
Gebruik een gestructureerde aanpak met pakketten, bijvoorbeeld:
- validation: voor validatie-logica
- sanitization: voor gegevenssanering
- logger: voor logging (bijvoorbeeld met logrus of zap)
- errors: voor aangepaste fouttypes
2. Validatie en Sanering Ontwerp
- Definieer duidelijke interfaces, zoals Validator en Sanitizer:
```go
type Validator interface {
Validate(input interface{}) error
}
type Sanitizer interface {
Sanitize(input interface{}) (interface{}, error)
}
```
- Implementeer specifieke validaties (bijv. e-mail, telefoonnummer) en saneringen (bijv. whitespace verwijderen, XSS-bescherming).
3. Foutafhandeling
- Gebruik gepaste fouttypes voor verschillende foutcategorieën.
- Voeg context toe aan errors met bijvoorbeeld errors.Wrap of fmt.Errorf.
- Log alle fouten met voldoende details.
4. Logging
- Gebruik een robuust loggingpakket zoals zap of logrus.
- Log op verschillende niveaus (info, warning, error).
- Log invoer en resultaten voor traceerbaarheid (bijvoorbeeld bij fouten).
5. Idiomatische en Schaalbare Code
- Vermijd globale variabelen; gebruik dependency injection.
- Maak gebruik van context.Context voor timeouts en traceerbaarheid.
- Overweeg batchverwerking en asynchrone verwerking indien nodig.
- Gebruik interfaces zodat je makkelijk kunt mocken bij testen.
Voorbeeldstructuur:
```go
package validation
import (
"errors"
"fmt"
)
type EmailValidator struct{}
func (v *EmailValidator) Validate(email string) error {
if email == "" {
return errors.New("email mag niet leeg zijn")
}
// voeg regex-validatie toe
return nil
}
```
6. Testen
- Schrijf unittests voor elke validatie- en saneringsfunctie.
- Gebruik table-driven tests voor uitgebreide dekking.
- Test foutscenario’s uitgebreid.
- Maak gebruik van mock-implementaties voor dependencies.
- Overweeg integratietests voor volledige workflows.
7. Mogelijke Optimalisaties
- Cache resultaten indien validatie kostbaar is en hergebruik mogelijk.
- Gebruik worker-pools voor verwerking van grote hoeveelheden gegevens.
- Profileer code en gebruik tools zoals pprof om bottlenecks te identificeren.
- Optimaliseer regex-uitdrukkingen en andere performantie-intensieve operaties.
Kort samengevat:
- Gebruik duidelijke, gescheiden pakketten.
- Pas idiomatische Go-praktijken toe (interfaces, error wrapping).
- Implementeer uitgebreide logging.
- Test grondig met verschillende invoer en foutscenario’s.
- Optimaliseer op basis van profiling en gebruiksscenario’s.
Wil je dat ik je help met een concrete code-voorbeelden of een basisstructuur voor je module?
provider: deepseek
model: deepseek-chat
Ik help je graag met het ontwerpen van een Go-module voor validatie en sanering. Hier is een complete implementatie:
## Module Structuur
```
user-validation/
├── go.mod
├── validator/
│ ├── validator.go
│ ├── errors.go
│ └── sanitizer.go
├── logging/
│ └── logger.go
└── examples/
└── main.go
```
## Core Implementatie
### validator/errors.go
```go
package validator
import "fmt"
type ValidationError struct {
Field string
Message string
Value interface{}
}
func (e *ValidationError) Error() string {
return fmt.Sprintf("validatiefout voor veld %s: %s (waarde: %v)",
e.Field, e.Message, e.Value)
}
type ErrorType int
const (
ErrorTypeRequired ErrorType = iota
ErrorTypeFormat
ErrorTypeLength
ErrorTypeRange
)
```
### validator/validator.go
```go
package validator
import (
"context"
"regexp"
"strings"
"unicode/utf8"
)
type Validator struct {
logger Logger
}
type Logger interface {
Info(ctx context.Context, msg string, fields map[string]interface{})
Warn(ctx context.Context, msg string, fields map[string]interface{})
Error(ctx context.Context, msg string, fields map[string]interface{})
}
func NewValidator(logger Logger) *Validator {
return &Validator{logger: logger}
}
func (v *Validator) ValidateEmail(ctx context.Context, email string) error {
emailRegex := `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`
if email == "" {
err := &ValidationError{Field: "email", Message: "verplicht veld", Value: email}
v.logValidationError(ctx, err)
return err
}
matched, _ := regexp.MatchString(emailRegex, email)
if !matched {
err := &ValidationError{Field: "email", Message: "ongeldig formaat", Value: email}
v.logValidationError(ctx, err)
return err
}
return nil
}
func (v *Validator) ValidateStringLength(ctx context.Context, field, value string, min, max int) error {
length := utf8.RuneCountInString(value)
if length < min {
err := &ValidationError{Field: field, Message: "te kort", Value: value}
v.logValidationError(ctx, err)
return err
}
if max > 0 && length > max {
err := &ValidationError{Field: field, Message: "te lang", Value: value}
v.logValidationError(ctx, err)
return err
}
return nil
}
func (v *Validator) logValidationError(ctx context.Context, err *ValidationError) {
v.logger.Warn(ctx, "Validatiefout opgetreden", map[string]interface{}{
"field": err.Field,
"message": err.Message,
"value": err.Value,
})
}
```
### validator/sanitizer.go
```go
package validator
import (
"context"
"html"
"strings"
"unicode"
)
type Sanitizer struct {
logger Logger
}
func NewSanitizer(logger Logger) *Sanitizer {
return &Sanitizer{logger: logger}
}
func (s *Sanitizer) SanitizeString(ctx context.Context, input string) string {
sanitized := strings.TrimSpace(input)
sanitized = html.EscapeString(sanitized)
s.logger.Info(ctx, "String gesaneerd", map[string]interface{}{
"original": input,
"sanitized": sanitized,
})
return sanitized
}
func (s *Sanitizer) RemoveSpecialChars(ctx context.Context, input string) string {
return strings.Map(func(r rune) rune {
if unicode.IsLetter(r) || unicode.IsDigit(r) || unicode.IsSpace(r) {
return r
}
return -1
}, input)
}
```
### logging/logger.go
```go
package logging
import (
"context"
"log"
"os"
)
type Logger struct {
*log.Logger
}
func NewLogger() *Logger {
return &Logger{
Logger: log.New(os.Stdout, "VALIDATION: ", log.LstdFlags|log.Lshortfile),
}
}
func (l *Logger) Info(ctx context.Context, msg string, fields map[string]interface{}) {
l.Printf("INFO: %s - %+v", msg, fields)
}
func (l *Logger) Warn(ctx context.Context, msg string, fields map[string]interface{}) {
l.Printf("WARN: %s - %+v", msg, fields)
}
func (l *Logger) Error(ctx context.Context, msg string, fields map[string]interface{}) {
l.Printf("ERROR: %s - %+v", msg, fields)
}
```
## Testadvies
### Unit Tests
```go
func TestEmailValidation(t *testing.T) {
logger := &MockLogger{}
validator := NewValidator(logger)
tests := []struct {
email string
expected error
}{
{"test@example.com", nil},
{"invalid-email", errors.New("validatiefout")},
{"", errors.New("verplicht veld")},
}
for _, test := range tests {
err := validator.ValidateEmail(context.Background(), test.email)
// Asserties toevoegen
}
}
```
### Integration Tests
Test de complete flow met echte logging en context propagation.
### Benchmark Tests
```go
func BenchmarkEmailValidation(b *testing.B) {
validator := NewValidator(&MockLogger{})
for i := 0; i < b.N; i++ {
validator.ValidateEmail(context.Background(), "test@example.com")
}
}
```
## Optimalisatie-advies
1. **Regex Pre-compilatie**: Pre-compileer regex-patronen bij initialisatie
2. **Pooling**: Gebruik `sync.Pool` voor veelgebruikte objecten
3. **Concurrentie**: Implementeer parallelle validatie voor batches
4. **Caching**: Cache validatieresultaten voor vaak voorkomende waarden
5. **Custom Validators**: Maak herbruikbare validatiefuncties met generics
## Gebruiksvoorbeeld
```go
func main() {
logger := logging.NewLogger()
validator := validator.NewValidator(logger)
sanitizer := validator.NewSanitizer(logger)
ctx := context.Background()
// Validatie
if err := validator.ValidateEmail(ctx, "user@example.com"); err != nil {
// Afhandeling
}
// Sanering
cleanInput := sanitizer.SanitizeString(ctx, userInput)
}
```
## Best Practices
1. Gebruik context voor tracing en timeout handling
2. Implementeer custom error types voor betere foutafhandeling
3. Gebruik interfaces voor testbaarheid
4. Voeg metrics toe voor monitoring
5. Documenteer alle exported functies
Deze module is schaalbaar, idiomatisch Go en bevat robuuste foutafhandeling met uitgebreide logging.
error: Generation failed [deepseek] prompt_id=1839 locale=en err=DeepSeek connection/timeout | Generation failed [deepseek] prompt_id=1839 locale=fr err=DeepSeek connection/timeout | Generation failed [deepseek] prompt_id=1839 locale=es err=DeepSeek connection/timeout