Ich analysiere eine große Anzahl von HTTP-Protokollen mit einem Ziel und gebe an, wie viele Anfragen jede IP-Adresse generiert hat.Golang: optimale Art der Eingabe von assoziativen Slices?
Das erste, was ich tat, ist:
var hits = make(map[string]uint)
// so I could populate it with
hits[ipAddr]++
Allerdings würde ich es gerne machen „getippt“, so dass es sofort klar wäre, dass hits[string]uint
eine IP-Adresse als String Kennung verwendet. Ich dachte, vielleicht auch eine Struktur kann mir helfen:
type Hit struct {
IP string
Count uint
}
Aber auf diese Weise (ich glaube) ich die Leistung zu verlieren, weil ich jetzt, wie man wirklich spezifischen Hit suche es Zahl zu erhöhen. Ich tolerieren, dass ich hier paranoid sein könnte, und einfach für die Schleife gehen könnte:
var hits = make([]Hit)
// TrackHit just damn tracks it
func TrackHit(ip string) {
for hit, _ := range hits {
if hit.IP == ip {
hit.Count++
return
}
}
append(hits, Hit{
IP: ip,
Count: 0,
})
}
Aber das sieht einfach ... suboptimal. Ich denke, alles, was in einer Zeile geschrieben werden kann, lässt dich als Profi glänzen, und wenn eine Zeile zu 13 wird, tendiere ich dazu, "whaaa? Etwas falsch zu machen, Mama?"
Irgendein getippter Einzeiler hier in Go?
Dank
Typ IP-Zeichenfolge; Typ Hits map [IP] uint – Uvelichitel
und dann 'hits [IP {ipAddr}] ++'? Und wenn ja, weist es doppelt so viel Speicher zu, weil wir bei jeder Schleife, die wir durchlaufen, eine neue IP erstellen? –
Treffer [IP ("127.0.0.1")] ++; Es ist mehr oder weniger idiomatisch. – Uvelichitel