diff --git a/hw10_program_optimization/go.mod b/hw10_program_optimization/go.mod index d0736cd..81dbf2a 100644 --- a/hw10_program_optimization/go.mod +++ b/hw10_program_optimization/go.mod @@ -2,4 +2,7 @@ module github.com/tiburon-777/HW_OTUS/hw10_program_optimization go 1.14 -require github.com/stretchr/testify v1.5.1 +require ( + github.com/json-iterator/go v1.1.10 + github.com/stretchr/testify v1.5.1 +) diff --git a/hw10_program_optimization/go.sum b/hw10_program_optimization/go.sum index 331fa69..c1291ea 100644 --- a/hw10_program_optimization/go.sum +++ b/hw10_program_optimization/go.sum @@ -1,8 +1,18 @@ github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= diff --git a/hw10_program_optimization/stats.go b/hw10_program_optimization/stats.go index 5cee6f1..f4111fc 100644 --- a/hw10_program_optimization/stats.go +++ b/hw10_program_optimization/stats.go @@ -1,11 +1,11 @@ package hw10_program_optimization //nolint:golint,stylecheck import ( - "encoding/json" - "fmt" + "bufio" "io" - "io/ioutil" "strings" + + jsoniter "github.com/json-iterator/go" ) type User struct { @@ -20,42 +20,24 @@ type User struct { type DomainStat map[string]int +var json = jsoniter.ConfigCompatibleWithStandardLibrary + func GetDomainStat(r io.Reader, domain string) (DomainStat, error) { - u, err := getUsers(r) - if err != nil { - return nil, fmt.Errorf("get users error: %s", err) - } - return countDomains(u, domain) -} - -type Users []User - -func getUsers(r io.Reader) (Users, error) { - result := make([]User, 10000) - content, err := ioutil.ReadAll(r) - if err != nil { - return result, err - } - - lines := strings.Split(string(content), "\n") - for _, line := range lines { - var user User - if err = json.Unmarshal([]byte(line), &user); err != nil { - return result, err + result := make(DomainStat) + var err error + var user User + e := bufio.NewReader(r) + for { + line, _, err := e.ReadLine() + if err == io.EOF { + break + } + if err = json.Unmarshal(line, &user); err != nil { + return nil, err + } + if strings.Contains(user.Email, "."+domain) { + result[strings.ToLower(strings.SplitN(user.Email, "@", 2)[1])]++ } - result = append(result,user) } return result, err } - -func countDomains(u Users, domain string) (DomainStat, error) { - result := make(DomainStat) - i:=0 - for _, user := range u { - if strings.Contains(user.Email,"."+domain) { - result[strings.ToLower(strings.SplitN(user.Email, "@", 2)[1])]++ - i++ - } - } - return result, nil -}