Go语言之旅练习#18:切片

21
我正在尝试完成来自 Go Tour 的“Slices”练习(Exercise: Slices),点击这里查看。但是我并不真正理解需要我做什么。

实现 Pic 函数,它应该返回长度为 dy 的切片,每个元素都是长度为 dx 的8位无符号整数切片。当你运行程序时,它将把这些整数解释为灰度(蓝度)值,并显示出你的图片。

以下是我的代码:

package main

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

func Pic(dx, dy int) [][]uint8 {
    a := make([][]uint8, dy)
    return a
}

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

到目前为止,我已经创建了一个长度为dy的切片。但是,我不理解下一步该怎么做。我是否需要创建一个for循环,将我的切片中的每个元素分配给dx范围内的一个值?我不要求代码,而是要求解释/澄清。

2个回答

26
我需要创建一个for循环,将我的切片的每个元素分配给dx范围内的一个值吗?
是的:
  • 外层循环将a[x]赋值为大小为dx的[]uint8切片,
  • 内部循环'y'为每个元素a[x](它是[]uint8之一)分配值,以便将a[x][y]分配给所需的值(即其中一个“有趣的函数”,如x^y,(x+y)/2和xy)。
    x和y是在切片(a,然后a[x])上的索引范围:请参见“For语句”。
我喜欢(x ^ y) * (x ^ y):

res

正如rwilson04below的评论中所说:

x*x + y*y是另一个不错的例子

x square plus y square

Waqas Ilyas评论中建议使用以下代码:y * 10000 / (x + 1)

y * 10000 / (x + 1)


1
@rwilson04 很好!我已经将您的评论包含在答案中以增加可见性,并添加了从 x*x + y*y 得出的图片。 - VonC
这是一条关于编程的留言,但你可以在你的“有趣函数”中使用 << 来缩小图案。<<2 可以使其减半,<<3 则可以将其缩小为四分之一等等。这会给你带来一些有趣的图案。 - user11809641
另一个是 y * 10000 / (x + 1) - Waqas Ilyas
@WaqasIlyas 不错!我已经将它包含在答案中以增加可见性。 - VonC

11
请看这里,有两种方法供您选择。
package main

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

func Pic(dx, dy int) [][]uint8 {
    p := make([][]uint8, dy)
    for y := range p {
        p[y] = make([]uint8, dx)
        for x := range p[y] {
        p[y][x] = uint8(x^y)
        // p[y][x] = uint8(x*y)
        // p[y][x] = uint8((x+y)/2)
        }
    }
    return p
}

func _Pic(dx, dy int) [][]uint8 {
    p := make([][]uint8, dy)
    for i := 0; i < dy; i++ {
        p[i] = make([]uint8, dx)
    }
    for y := range p {
        for x := range p[y] {
            p[y][x] = uint8(x^y)
            // p[y][x] = uint8(x*y)
            // p[y][x] = uint8((x+y)/2)
        }
    }
    return p
}

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

4
OP明确表示他们对代码并不感兴趣,而是希望得到解释。而这个回答恰恰相反。 - kapad
3
我发现这段代码非常有用。 - Erik Bennett
2
代码可能对楼主没有帮助,但对其他人有用。 - indika
仅仅提供代码而没有任何解释并不是最好的回答类型,尤其是当有人在请求教程练习帮助时(即试图学习)更是无益的。 - Tijmen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接