Попробуй понять, как построить массив из int params - PullRequest
0 голосов
/ 29 ноября 2018

Все:

Когда я пытаюсь следовать Tour of Go Голанга:

Упражнение: ломтики

Мой код такой:

package main

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

func Pic(dx, dy int) [][]uint8 {
    const x = dx
    const y = dy
    pic := [y][x]uint8{};

    for r:=range pic {
        row := pic[r]
        for c := range row {
            row[c] = uint8(c*r) 
        }
    }

    return pic[:]
}

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

И я получил ошибку вроде:

prog.go:6:8: const initializer dx is not a constant
prog.go:7:8: const initializer dy is not a constant

Я довольно новичок в Go, Интересно, что означает эта ошибка, и хочу ли я сначала создать массив (другойчем использовать make () для построения слайса), как я могу передать длину массива?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Ошибка

Ошибка возникает при попытке определить константу из переменной.В Go константы должны быть определены как литералы или выражения, построенные из других констант.Ваши x и y определяются по-разному в зависимости от входа функции Pic.Как правило, константы определяются во время компиляции.

Например, в Go хорошо следующее:

const w = 100
const x = 200
const y = w + x
const z = x + y + 300

Но следующее не так:

var x = 100
const y = x + 10

иэтот второй пример, по сути, происходит в вашем коде, поскольку dx и dy различаются в зависимости от ввода в функцию Pic.

Если вы используете JavaScript, который также имеет const, это может показаться странным поведением.В JavaScript константа - это просто переменная, которую нельзя изменить после объявления.В Go константа более постоянна, чем в JS.

Ознакомьтесь с этим постом, чтобы узнать больше о константах в Go: https://blog.golang.org/constants

Создание массива

Размеры массива имеют ограничения, аналогичные постоянным значениям в Go.В этом примере, если вы попытаетесь установить размер массива равным dx или dy, вы получите ошибку:

с константой, не связанной с массивом, dx

Таким образом, вам придется использовать слайс в этом примере.Простейшим способом будет определить ваш срез длиной dy, например:

pic := make([][]uint8, dy)
0 голосов
/ 29 ноября 2018

Нет постоянных значений.Например,

package main

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

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

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

Детская площадка: https://play.golang.org/p/JQwGhfBth0o

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...