Вы получаете сообщение об ошибке в 2-ом случае, потому что вы пытаетесь порезать возвращаемое значение вызова функции (представляемый sha1.Sum()
):
sha1.Sum(([]byte)(uf.Pwd))[:]
возвращаемые значения вызовов функции не адресацией. Напомним, что (только) следующие адресуемые (взяты из Spec: Address operators):
... переменная, указатель разыменования, или операция ломтика индексации; или селектор поля адресного структурного операнда; или операцию индексирования массива адресного массива. В качестве исключения для требования адресности, x
также может быть (возможно, в скобках) composite literal.
И для нарезки массива требуется, чтобы массив был адресуемым. Spec: Slice expressions:
Если операнд нарезанный является массивом, он должен быть addressable и результат операции среза является срезом с тем же типом элемента в качестве массива.
Ваш первый случай работает, потому что вы сначала сохраняете возвращенный массив в локальной переменной, которая адресуется.
Нарезка массива требует, чтобы массив был адресуемым, поскольку нарезка приводит к фрагменту, который не будет копировать данные массива, но создает срез, который разделяет массив подстановки и будет указывать/ссылаться на него.