2015-09-28 2 views
4

Я хочу присоединиться к двум строкам, но получаю сообщение об ошибке.Различное поведение переменной и возвращаемое значение функции

Оригинал:

hash := sha1.Sum([]byte(uf.Pwd)) 
u.Pwhash = hex.EncodeToString(hash[:]) 

Joint:

u.Pwhash = hex.EncodeToString(sha1.Sum([]byte(uf.Pwd))[:]) 

Первый из них работает отлично, второй выдает сообщение об ошибке:

models/models.go:104: invalid operation sha1.Sum(([]byte)(uf.Pwd))[:] (slice of unaddressable value) 

Почему это?

ответ

9

Вы получаете сообщение об ошибке в 2-ом случае, потому что вы пытаетесь порезать возвращаемое значение вызова функции (представляемый sha1.Sum()):

sha1.Sum(([]byte)(uf.Pwd))[:] 

возвращаемые значения вызовов функции не адресацией. Напомним, что (только) следующие адресуемые (взяты из Spec: Address operators):

... переменная, указатель разыменования, или операция ломтика индексации; или селектор поля адресного структурного операнда; или операцию индексирования массива адресного массива. В качестве исключения для требования адресности, x также может быть (возможно, в скобках) composite literal.

И для нарезки массива требуется, чтобы массив был адресуемым. Spec: Slice expressions:

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

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

Нарезка массива требует, чтобы массив был адресуемым, поскольку нарезка приводит к фрагменту, который не будет копировать данные массива, но создает срез, который разделяет массив подстановки и будет указывать/ссылаться на него.

Смежные вопросы