Передача массивов в функции в Go
В Go массивы являются типами-значениями, поэтому при передаче массива в функцию фактически передаётся копия массива.
Если вы хотите передать параметр-массив в функцию, вам нужно объявить формальный параметр как массив в определении функции. Мы можем объявить его следующими двумя способами:
Способ 1
Указание размера массива в формальных параметрах:
func myFunction(param [10]int) {
....
}
Способ 2
Без указания размера массива в формальных параметрах:
func myFunction(param []int) {
....
}
Если вы хотите изменить исходный массив внутри функции, вы можете сделать это, передав указатель на массив.
Пример
Давайте рассмотрим следующий пример. В этом примере функция получает параметр-массив целых чисел, другой параметр задаёт количество элементов в массиве, и она возвращает среднее значение:
Пример
{
var i int
var avg, sum float32
for i = 0; i < size; ++i {
sum += arr[i]
}
avg = sum / size
return avg;
}
Далее вызовем эту функцию:
Пример
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
В приведенном выше примере формальные параметры, которые мы использовали, не указывали размер массива.
Вычисления с плавающей точкой могут давать небольшие отклонения в выводе; также можно преобразовать значение к целочисленному типу, чтобы задать точность.
Пример
import (
"fmt"
)
func main() {
a := 1.69
b := 1.7
c := a * b // Результат должен быть 2.873
fmt.Println(c) // Вывод: 2.8729999999999998
}
Установите фиксированную точность:
Пример
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) // Отображение
}
Если вы хотите изменить исходный массив внутри функции, вы можете сделать это, передав указатель на массив.
Следующий пример демонстрирует, как передать массив в функцию. Функция принимает массив и указатель на массив в качестве параметров:
Пример
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]Другие расширения