Почему этот код требует, чтобы я включил размер массива в объявление функции? - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь передать массив float64 в функцию, которая добавит значения и вернет сумму. Мой код выглядит следующим образом:

func addThemNumbers(numbers []float64)  float64{
    sum := 0.0 
    for _,value := range numbers {
        sum += value 
    }
    return sum
}
func main() { 
    favNums := [2]float64 {0.9, 1.997}
    fmt.Println("Sum: ", addThemNumbers(favNums))
}

Когда я запускаю это, он выдает эту ошибку:

/main.go:33:40: cannot use favNums (type [2]float64) as type []float64 in argument to addThemNumbers

Однако, когда я указываю размер 2 в моей функции, такой, что addThemNumbers(numbers [2]float64) , нет ошибки, и он работает. Если было несовпадение типов, я не понимаю, почему указание размера массива работает. Я видел несколько примеров, когда указывать размер массива в функции не нужно, так что мне не хватает?

Ответы [ 3 ]

2 голосов
/ 21 апреля 2020

[2]float64 - это массив. Когда вы объявляете функцию f([2]float64), вы можете передавать ей только значение типа [2]float64, а когда вы это делаете, она передает копию всего массива. Массив - это структура фиксированного размера.

[]float64 - это срез. По сути, это структура, содержащая указатель на массив, его длину и емкость. Срез содержит указатель на массив, поэтому, если у вас есть функция f([]float64), вы можете передать ей массив любого размера, и будет передана ссылка на базовый массив, а не его копия.

Чтобы преобразовать массив в фрагмент, вы можете использовать arr[:]. В вашей программе:

    fmt.Println("Sum: ", addThemNumbers(favNums[:]))
1 голос
/ 21 апреля 2020

есть разница между массивом и срезом. Я думаю, что вы ищете это срез.

В параметре функции вы ожидаете срез, а скорее вы передали массив.

Есть два способа с этим справиться , быстро:

  1. Чтобы устранить несоответствие типов, укажите размер в параметре, чтобы он теперь принимал массив (не срез).
  2. Преобразование массива в ломтик
fmt.Println("Sum: ", addThemNumbers(favNums[:]))

Также, пожалуйста, прочтите эту статью на ломтиках

0 голосов
/ 22 апреля 2020

На самом деле, когда мы смотрим на [] float64 & [2] float64 выглядит одинаково. Но есть разница: [] float64 - это срез, а [2] float64 - это массив.

Так что, когда вы меняете addThemNumbers (numbers [2] float64), он автоматически превращается в массив. Таким образом, вы можете запустить программу без ошибок.

И если вы хотите преобразовать массив в фрагмент, вы можете попробовать код ниже.

func addThemNumbers(numbers []float64)  float64{
    sum := 0.0
    for _,value := range numbers {
        sum += value
    }
    return sum
}
func main() {
    favNums := [2]float64 {0.9, 1.997}
    fmt.Println("Sum: ", addThemNumbers(favNums[:]))
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...