Передача массивов в функции в Go

Массивы в Go

В Go массивы являются типами-значениями, поэтому при передаче массива в функцию фактически передаётся копия массива.

Если вы хотите передать параметр-массив в функцию, вам нужно объявить формальный параметр как массив в определении функции. Мы можем объявить его следующими двумя способами:

Способ 1

Указание размера массива в формальных параметрах:

func myFunction(param [10]int) {
    ....
}

Способ 2

Без указания размера массива в формальных параметрах:

func myFunction(param []int) {
    ....
}

Если вы хотите изменить исходный массив внутри функции, вы можете сделать это, передав указатель на массив.

Пример

Давайте рассмотрим следующий пример. В этом примере функция получает параметр-массив целых чисел, другой параметр задаёт количество элементов в массиве, и она возвращает среднее значение:

Пример

func getAverage(arr []int, size int) float32
{
   var i int
   var avg, sum float32  

   for i = 0; i < size; ++i {
      sum += arr[i]
   }

   avg = sum / size

   return avg;
}

Далее вызовем эту функцию:

Пример

package main

import "fmt"

func main() {
   /* Длина массива равна 5 */
   var  balance = [5]int {1000, 2, 3, 17, 50}
   var avg float32

   /* Массив передаётся в функцию как параметр */
   avg = getAverage( balance, 5 ) ;

   /* Вывести возвращённое среднее значение */
   fmt.Printf( "Среднее значение: %f ", avg );
}
func getAverage(arr [5]int, size int) float32 {
   var i,sum int
   var avg float32  

   for i = 0; i < size;i++ {
      sum += arr[i]
   }

   avg = float32(sum) / float32(size)

   return avg;
}

Результат вывода приведённого выше примера:

平均值为: 214.399994

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

Вычисления с плавающей точкой могут давать небольшие отклонения в выводе; также можно преобразовать значение к целочисленному типу, чтобы задать точность.

Пример

package main
import (
    "fmt"
)
func main() {
    a := 1.69
    b := 1.7
    c := a * b      // Результат должен быть 2.873
    fmt.Println(c)  // Вывод: 2.8729999999999998
}

Установите фиксированную точность:

Пример

package main
import (
    "fmt"
)
func main() {
    a := 1690           // Представляет 1.69
    b := 1700           // Представляет 1.70
    c := a * b          // Результат должен быть 2873000, что соответствует 2.873
    fmt.Println(c)      // Внутренняя кодировка
    fmt.Println(float64(c) / 1000000) // Отображение
}

Если вы хотите изменить исходный массив внутри функции, вы можете сделать это, передав указатель на массив.

Следующий пример демонстрирует, как передать массив в функцию. Функция принимает массив и указатель на массив в качестве параметров:

Пример

package main

import "fmt"

// Функция принимает массив в качестве параметра.
func modifyArray(arr [5]int) {
    for i := 0; i < len(arr); i++ {
        arr[i] = arr[i] * 2
    }
}

// Функция принимает указатель на массив в качестве параметра.
func modifyArrayWithPointer(arr *[5]int) {
    for i := 0; i < len(*arr); i++ {
        (*arr)[i] = (*arr)[i] * 2
    }
}

func main() {
    // Создайте целочисленный массив из 5 элементов.
    myArray := [5]int{1, 2, 3, 4, 5}

    fmt.Println("Исходный массив:", myArray)

    // Передача массива в функцию не изменяет значение исходного массива.
    modifyArray(myArray)
    fmt.Println("Массив после modifyArray:", myArray)

    // Передача указателя на массив в функцию может изменить значение исходного массива.
    modifyArrayWithPointer(&myArray)
    fmt.Println("Массив после modifyArrayWithPointer:", myArray)
}

В приведённом выше примере функция modifyArray принимает массив и пытается изменить значения массива, но после её вызова в функции main исходный массив не был изменён. В отличие от неё, функция modifyArrayWithPointer принимает указатель на массив и изменяет значения исходного массива через указатель.

Результат вывода приведённого выше примера:

Original Array: [1 2 3 4 5]
Array after modifyArray: [1 2 3 4 5]
Array after modifyArrayWithPointer: [2 4 6 8 10]

Массивы в Go

Другие расширения