GoLang 투어의 11가지 연습 솔루션
Go 웹사이트 둘러보기는 Go 언어를 배우려는 개발자에게 훌륭한 출발점입니다. 다양한 부분을 설명하여 점차적으로 언어를 소개하고 독자에게 구현하기 위한 연습을 제공합니다.
다음은 둘러보기를 진행하면서 실습을 위해 작성한 솔루션입니다.
연습 1. 루프 및 함수
숫자 x가 주어지면 z²가 x에 가장 가까운 숫자 z를 찾고자 합니다.
package main
import (
"fmt"
"math"
)
func Sqrt(x float64) float64 {
z := float64(1)
for i:=1; i<=10; i++ {
fmt.Println(z)
z -= (z * z - x) / (2 * z)
}
return z
}
func main() {
fmt.Println(Sqrt(2))
fmt.Println(math.Sqrt(2))
}
연습 2. 슬라이스
그림을 구현합니다. 길이 dy의 슬라이스를 반환해야 하며 각 요소는 dx 8비트 부호 없는 정수의 슬라이스입니다.
package main
import "golang.org/x/tour/pic"
func Pic(dx, dy int) [][]uint8 {
var result = make([][]uint8, dy)
for x := range result {
result[x] = make([]uint8, dx)
for y:= range result[x] {
result[x][y] = uint8(x*y)
}
}
return result
}
func main() {
pic.Show(Pic)
}
연습 3. 지도
WordCount를 구현합니다. 문자열 s의 각 "단어"개수 맵을 반환해야 합니다. 화장실 테스트 기능은 제공된 기능에 대해 테스트 스위트를 실행하고 성공 또는 실패를 인쇄합니다.
package main
import (
"golang.org/x/tour/wc"
"strings"
)
func WordCount(s string) map[string]int {
result := make(map[string]int)
words := strings.Fields(s)
for _, word := range words {
result[word] += 1
}
return result
}
func main() {
wc.Test(WordCount)
}
연습 4. 피보나치 클로저
연속적인 피보나치 수(0, 1, 1, 2, 3, 5, …)를 반환하는 함수(클로저)를 반환하는 피보나치 함수 구현
package main
import "fmt"
func fibonacci() func() int {
total, nextTotal := 0, 1
return func() int {
result := total
total, nextTotal = nextTotal, nextTotal + result
return result
}
}
func main() {
f := fibonacci()
for i := 0; i < 10; i++ {
fmt.Println(f())
}
}
연습 5. 스트링거
IPAddr 유형은 fmt.Stringer를 구현하여 주소를 점으로 구분된 쿼드로 인쇄합니다.
package main
import "fmt"
type IPAddr [4]byte
func (ia IPAddr) String() string {
return fmt.Sprintf("%d %d %d %d", ia[0], ia[1], ia[2], ia[3])
}
func main() {
hosts := map[string]IPAddr{
"loopback": {127, 0, 0, 1},
"googleDNS": {8, 8, 8, 8},
}
for name, ip := range hosts {
fmt.Printf("%v: %v\n", name, ip)
}
}
연습 6. 오류
Sqrt는 복소수를 지원하지 않기 때문에 음수가 주어지면 nil이 아닌 오류 값을 반환해야 합니다.
package main
import (
"fmt"
"math"
)
type ErrNegativeSqrt float64
func (e ErrNegativeSqrt) Error() string {
return fmt.Sprintf("cannot Sqrt negative number: %d", e)
}
func Sqrt(x float64) (float64, error) {
if (x < 0) {
return 0, ErrNegativeSqrt(x)
}
z := float64(1)
tolerance := 1e-6
for {
oldz := z
z -= (z * z - x) / (2 * z)
if math.Abs(z-oldz) < tolerance {
break;
}
}
return z, nil
}
func main() {
fmt.Println(Sqrt(2))
fmt.Println(Sqrt(-2))
}
연습 7. 독자
ASCII 문자 'A'의 무한 스트림을 내보내는 Reader 유형을 구현합니다.
package main
import "golang.org/x/tour/reader"
type MyReader struct{}
func (r MyReader) Read(b []byte) (int, error) {
a := 'A'
for i:=0; i < len(b); i++ {
b[i] = a
}
return len(b), nil
}
// TODO: Add a Read([]byte) (int, error) method to MyReader.
func main() {
reader.Validate(MyReader{})
}
연습 8. rot13Reader
io.Reader를 구현하고 io.Reader에서 읽는 rot13Reader를 구현하고 모든 알파벳 문자에 rot13 대체 암호를 적용하여 스트림을 수정합니다.
package main
import (
"io"
"os"
"strings"
)
type rot13Reader struct {
r io.Reader
}
func (rd *rot13Reader) Read(b []byte) (n int, e error) {
n, e = rd.r.Read(b)
for i:=0; i<len(b); i++ {
c := b[i]
if (c >= 'a' && c <= 'm') || (c >= 'A' && c <= 'M') {
b[i] += 13;
} else if (c >= 'n' && c <= 'z') || (c >= 'N' && c <= 'Z') {
b[i] -= 13;
}
}
return
}
func main() {
s := strings.NewReader("Lbh penpxrq gur pbqr!")
r := rot13Reader{s}
io.Copy(os.Stdout, &r)
}
연습 9: 이미지
다른 것을 작성하되 이번에는 데이터 조각 대신 image.Image 구현을 반환합니다. 고유한 이미지 유형을 정의하고 필요한 메소드를 구현하고 pic.ShowImage를 호출하십시오. 범위는 image.Rect(0, 0, w, h)와 같은 image.Rectangle을 반환해야 합니다. ColorModel은 color.RGBAModel을 반환해야 합니다. At는 색상을 반환해야 합니다. 마지막 그림 생성기의 값 v는 이 그림에서 color.RGBA{v, v, 255, 255}에 해당합니다.
package main
import (
"golang.org/x/tour/pic"
"image"
"image/color"
)
type Image struct{
x int
y int
}
func (i Image) Bounds() image.Rectangle {
return image.Rect(0, 0, i.x, i.y)
}
func (i Image) At(x, y int) color.Color {
v := uint8(x*y)
return color.RGBA{v, v, 255, 255}
}
func (i Image) ColorModel() color.Model {
return color.RGBAModel
}
func main() {
m := Image{256, 65}
pic.ShowImage(m)
}
연습 10: 등가 이진 트리
t1과 t2가 동일한 값을 저장하는지 확인하기 위해 Walk 함수와 Same 함수를 Walk를 사용하여 구현합니다.
package main
import (
"golang.org/x/tour/tree"
"fmt"
)
// Walk walks the tree t sending all values
// from the tree to the channel ch.
func Walk(t *tree.Tree, ch chan int) {
WalkHelper(t, ch)
close(ch)
}
func WalkHelper(t *tree.Tree, ch chan int) {
if t == nil {
return
}
WalkHelper(t.Left, ch)
ch <- t.Value
WalkHelper(t.Right, ch)
}
// Same determines whether the trees
// t1 and t2 contain the same values.
func Same(t1, t2 *tree.Tree) bool {
ch1 := make(chan int)
ch2 := make(chan int)
go Walk(t1, ch1)
go Walk(t2, ch2)
for v1 := range ch1 {
v2 := <-ch2
if v1 != v2 {
return false
}
}
return true
}
func main() {
fmt.Println(Same(tree.New(1), tree.New(1)))
fmt.Println(Same(tree.New(1), tree.New(2)))
}
연습 11: 웹 크롤러
Go의 동시성 기능을 사용하여 웹 크롤러를 병렬화합니다. 동일한 URL을 두 번 가져오지 않고 병렬로 URL을 가져오도록 크롤링 기능을 수정합니다.
package main
import (
"fmt"
"sync"
)
type Fetcher interface {
// Fetch returns the body of URL and
// a slice of URLs found on that page.
Fetch(url string) (body string, urls []string, err error)
}
var cache = make(Cache)
var wg sync.WaitGroup
var mux sync.Mutex
// Crawl uses fetcher to recursively crawl
// pages starting with url, to a maximum of depth.
func Crawl(url string, depth int, fetcher Fetcher) {
defer wg.Done()
if cache.get(url) {
fmt.Printf("xx Skipping: %s\n", url)
return
}
fmt.Printf("** Crawling: %s\n", url)
cache.set(url, true)
if depth <= 0 {
return
}
body, urls, err := fetcher.Fetch(url)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("found: %s %q\n", url, body)
for _, u := range urls {
wg.Add(1)
go Crawl(u, depth-1, fetcher)
}
return
}
func main() {
wg.Add(1)
Crawl("https://golang.org/", 4, fetcher)
wg.Wait()
}
type Cache map[string]bool
func (ch Cache) get(key string) bool {
mux.Lock()
defer mux.Unlock()
return cache[key]
}
func (ch Cache) set(key string, value bool) {
mux.Lock()
defer mux.Unlock()
cache[key] = value
}
// fakeFetcher is Fetcher that returns canned results.
type fakeFetcher map[string]*fakeResult
type fakeResult struct {
body string
urls []string
}
func (f fakeFetcher) Fetch(url string) (string, []string, error) {
if res, ok := f[url]; ok {
return res.body, res.urls, nil
}
return "", nil, fmt.Errorf("not found: %s", url)
}
// fetcher is a populated fakeFetcher.
var fetcher = fakeFetcher{
"https://golang.org/": &fakeResult{
"The Go Programming Language",
[]string{
"https://golang.org/pkg/",
"https://golang.org/cmd/",
},
},
"https://golang.org/pkg/": &fakeResult{
"Packages",
[]string{
"https://golang.org/",
"https://golang.org/cmd/",
"https://golang.org/pkg/fmt/",
"https://golang.org/pkg/os/",
},
},
"https://golang.org/pkg/fmt/": &fakeResult{
"Package fmt",
[]string{
"https://golang.org/",
"https://golang.org/pkg/",
},
},
"https://golang.org/pkg/os/": &fakeResult{
"Package os",
[]string{
"https://golang.org/",
"https://golang.org/pkg/",
},
},
}
--
아눔 말리크
내 일일 기술 정보를 보려면 NMTechBytes를 팔로우하세요 :)
특별한 감사 …
Reference
이 문제에 관하여(GoLang 투어의 11가지 연습 솔루션), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/anumsmalik/11-solutions-of-exercises-in-golang-tour-33g6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)