go-tour的两个练习题-slice & map

slice

练习:slice

实现 Pic。它返回一个 slice 的长度 dy,和 slice 中每个元素的长度的 8 位无符号整数 dx。当执行这个程序,它会将整数转换为灰度(好吧,蓝度)图片进行展示。

图片的实现已经完成。可能用到的函数包括 (x+y)/2 、 x*y 和 x^y(使用 math.Pow 计算最后的函数)。

(需要使用循环来分配 [][]uint8 中的每个 []uint8。)

(使用 uint8(intValue) 在类型之间进行转换。)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package main
import "code.google.com/p/go-tour/pic"
func Pic(dx, dy int) [][]uint8 {
canvas := make([][]uint8, dx)
for i:=0; i<dx; i++ {
canvas[i] = make([]uint8, dy)
for j:=0; j<dy; j++ {
canvas[i][j] = uint8(i*j)
}
}
return canvas
}
func main() {
pic.Show(Pic)
}

当使用 append(slice-var, type-values, … ) 时,如果 slice-var 这个变量的容量不足以存储新追加的数据时,会进行复制数据到新的扩容的 slice 变量中,slice 变量指针已经改变!

slices 常用的方法

  1. 创建

s := make([]type, ilen, icap)

比如创建一个 5 个 byte 数据类型的 slice 并初始为 0

s := make([]byte, 5, 5)

  1. 获取指定 slice 变量的长度(实际使用)

i := len(s)

  1. 获取 slice 可存储的容量

c := cap(s)

map

练习:map

实现 WordCount。它应当返回一个含有 s 中每个 “词” 个数的 map。函数 wc.Test 针对这个函数执行一个测试用例,并输出成功还是失败。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main
import (
"strings"
"code.google.com/p/go-tour/wc"
)
func WordCount(s string) map[string]int {
slices := strings.Split(s, " ")
result := make(map[string]int)
for i := range slices {
result[slices[i]]++
}
return result
}
func main() {
wc.Test(WordCount)
}