A tour of Go 练习题答案

切片

题目

实现 Pic。它应当返回一个长度为 dy 的切片,其中每个元素是一个长度为 dx,元素类型为 uint8 的切片。当你运行此程序时,它会将每个整数解释为灰度值(好吧,其实是蓝度值)并显示它所对应的图像。

图像的选择由你来定。几个有趣的函数包括 (x+y)/2, xy, x^y, xlog(y) 和 x%(y+1)。

(提示:需要使用循环来分配 [][]uint8 中的每个 []uint8;请使用 uint8(intValue) 在类型之间转换;你可能会用到 math 包中的函数。)

代码

package main


import "golang.org/x/tour/pic"


func Pic(dx, dy int) [][]uint8 {
     
	picture := make([][]uint8, dy)
	for i:=0; i<dy; i++ {
     
		picture[i] = make([]uint8, dx)
		for j:=0; j<dx; j++ {
     
			picture[i][j] = uint8((i + j) / 2)
		}
	}
	return picture
}

func main() {
     
	pic.Show(Pic)
}

映射

题目

实现 WordCount。它应当返回一个映射,其中包含字符串 s 中每个“单词”的个数。函数 wc.Test 会对此函数执行一系列测试用例,并输出成功还是失败。

你会发现 strings.Fields 很有帮助。

代码

package main

import (
	"golang.org/x/tour/wc"
	"strings"
)

func WordCount(s string) map[string]int {
     
	words := strings.Fields(s)
	res := make(map[string]int)
	for _, word := range(words) {
     
		res[word]++
	}
	return res
	//return map[string]int{"x": 1}
}

func main() {
     
	wc.Test(WordCount)
}

斐波那契数列

题目

实现一个 fibonacci 函数,它返回一个函数(闭包),该闭包返回一个斐波纳契数列 (0, 1, 1, 2, 3, 5, ...)

代码

package main

import "fmt"

// 返回一个“返回int的函数”
func fibonacci() func() int {
     
	pre1 := 0
	pre2 := 1
	return func() int {
     
		temp := pre1
		pre1 = pre2
		pre2 = temp + pre2
		return temp
	}
}

func main() {
     
	f := fibonacci()
	for i := 0; i < 10; i++ {
     
		fmt.Println(f())
	}
}

Stringer

题目

通过让 IPAddr 类型实现 fmt.Stringer 来打印点号分隔的地址。

例如,IPAddr{1, 2, 3, 4} 应当打印为 “1.2.3.4”。

代码

package main

import "fmt"

type IPAddr [4]byte

// TODO: 给 IPAddr 添加一个 "String() string" 方法
func(addr IPAddr) String() string {
     
	return fmt.Sprintf("%v.%v.%v.%v", addr[0], addr[1], addr[2], addr[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)
	}
}

图像

题目

还记得之前编写的图片生成器 吗?我们再来编写另外一个,不过这次它将会返回一个 image.Image 的实现而非一个数据切片。

定义你自己的 Image 类型,实现必要的方法并调用 pic.ShowImage。

Bounds 应当返回一个 image.Rectangle ,例如 image.Rect(0, 0, w, h)。

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{
     
	w int
	h int
}

func (i Image) Bounds() image.Rectangle {
     
	return image.Rect(0, 0, i.w, i.h)
}
func (i Image) ColorModel() color.Model {
     
	return color.RGBAModel
}
func (i Image) At(x, y int) color.Color {
     
	return color.RGBA{
     uint8(x), uint8(y), 255, 255}
}

func main() {
     
	m := Image{
     250, 250}
	pic.ShowImage(m)
}

你可能感兴趣的:(区块链)