Передача массивов в качестве аргументов функции - PullRequest
0 голосов
/ 15 мая 2018

Я ожидал, что следующий фрагмент кода выдаст a как {0x01, 0x02} (передача по значению) или как {0x03, 0x02, 0x01} (передача по ссылке). Странно, но выдает результат как {0x03, 0x02}. Не могли бы вы помочь мне понять, почему это так?

package main

import "fmt"

func test1(t []byte) {
    t[0] = 0x03
    t = append(t, 0x01 )
}

func main() {
    a := []byte{0x01, 0x02 }
    test1(a)
    _ = a
    fmt.Printf("%v", a)
}

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Заголовок слайса передается по значению, но он ссылается на тот же массив поддержки.Поэтому, когда вы изменяете первое значение, оно также изменяется в исходном массиве.Когда вы вызываете append, новый заголовок слайса генерируется и записывается в пространство, занимаемое исходным значением аргумента, таким образом, оставаясь локальным для метода.

0 голосов
/ 15 мая 2018

В Go []byte - это не массив, это кусочек байта.

В результате размер a был равен 2, и после этого его первый элемент был изменен на 3, append выделил новый больший срез - и t был установлен на адрес нового выделенного среза, но это не влияет на a в main.

С Tour of Go about append:

Если резервный массив s слишком мал, чтобы соответствовать всем заданным значениям, будет выделен больший массив.Возвращенный фрагмент будет указывать на вновь выделенный массив.

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