Implemented sum, urlfetch and fetchall tasks

This commit is contained in:
Egor 2024-06-02 02:47:30 +03:00
parent 7937c2dc03
commit 750eaed481
4 changed files with 106 additions and 4 deletions

View file

@ -2,6 +2,61 @@
package main package main
func main() { import (
"fmt"
"io"
"net/http"
"os"
"time"
)
type HttpGetResult struct {
Success bool
Body string
Elapsed time.Duration
Size int
Url string
Error error
}
func (result HttpGetResult) String() string {
if result.Success {
return fmt.Sprintf("%v\t%v\t%v", result.Elapsed, result.Size, result.Url)
} else {
return result.Error.Error()
}
}
func GetHttpBody(url string, ch chan HttpGetResult) {
startTime := time.Now()
resp, err := http.Get(url)
if err != nil {
ch <- HttpGetResult{Success: false, Error: err}
return
}
defer resp.Body.Close()
data, err := io.ReadAll(resp.Body)
if err != nil {
ch <- HttpGetResult{Success: false, Error: err}
return
}
ch <- HttpGetResult{
Success: true,
Body: string(data),
Elapsed: time.Since(startTime),
Size: len(data),
Url: url,
}
}
func main() {
startTime := time.Now()
urls, ch := os.Args[1:], make(chan HttpGetResult)
for _, url := range urls {
go GetHttpBody(url, ch)
}
for i := 0; i < len(urls); i++ {
fmt.Println(<-ch)
}
fmt.Println(time.Since(startTime), "elapsed")
} }

View file

@ -3,5 +3,5 @@
package sum package sum
func Sum(a, b int64) int64 { func Sum(a, b int64) int64 {
return 0 return a + b
} }

View file

@ -2,6 +2,26 @@
package main package main
func main() { import (
"fmt"
"io"
"log"
"net/http"
"os"
)
func main() {
urls := os.Args[1:]
for _, url := range urls {
resp, err := http.Get(url)
if err != nil {
log.Fatal("fetch:", err)
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal("fetch:", err)
}
fmt.Println(string(body))
}
} }

View file

@ -2,6 +2,33 @@
package main package main
func main() { import (
"bufio"
"fmt"
"os"
)
func LinesCountInFile(lines map[string]int, filename string) {
file, err := os.Open(filename)
if err != nil {
return
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text()
lines[line]++
}
}
func main() {
filenames, lines := os.Args[1:], make(map[string]int)
for _, filename := range filenames {
LinesCountInFile(lines, filename)
}
for line, count := range lines {
if count != 1 {
fmt.Printf("%v\t%v\n", count, line)
}
}
} }