Comments 19
Заголовок спойлера
1 Оба раза пустой массив. Адреса совпадают.
2 Не скомпилируется
3 Функции будут вызваны в случайном порядке, но в соответствии с иерархии начиная с нижнего модуля (package_3) и заканчивая верхним (package_1)
4 1,2,3,4,5
5 В stdout ничего не выведется, но процесс завершится успешно
6 2
7 8 12
2 Не скомпилируется
3 Функции будут вызваны в случайном порядке, но в соответствии с иерархии начиная с нижнего модуля (package_3) и заканчивая верхним (package_1)
4 1,2,3,4,5
5 В stdout ничего не выведется, но процесс завершится успешно
6 2
7 8 12
+2
Можно было просто ссылку на play.golang.org скинуть :)
Попортил фан
Попортил фан
+1
Небольшое дополнение по 3: в принципе, порядок вызова init-функций в рамках одного пакета строго не регламентирован, в спецификации написано:
To ensure reproducible initialization behavior, build systems are encouraged to present multiple files belonging to the same package in lexical file name order to a compiler.Поэтому, при запуске мы увидем:
p3_bash.go
p3_sh.go
p3_zsh.go
p2_a.go
p1_a.go
p1_b.go
+1
Я, конечно же, (почти) всё уже проверил сам на play.golang.org, но вот мои оригинальные ответы:
Скрытый текст
1. Оба раза пустой массив. Адреса совпадают.
2. Не скомпилируется (но я думал, что по причине того, что capacity не может быть меньше длины, а не потому что длина обязательна)
3. Функции будут вызваны в случайном порядке, но в соответствии с иерархии начиная с нижнего модуля (package_3) и заканчивая верхним (package_1)
4. 1,2,3,0,1 — кстати говоря, такого варианта у вас нет, видимо опечатка
5. В stdout ничего не выведется, но процесс завершится успешно — но за такой код я бы наказывал
6. 2
7. 8 14 — строго говоря, программисты на Го вряд ли должны знать ширину китайских иероглифов в UTF-8. Тут скорее важно, что сами ответы будут разные при итерации по символам и по байтам.
2. Не скомпилируется (но я думал, что по причине того, что capacity не может быть меньше длины, а не потому что длина обязательна)
3. Функции будут вызваны в случайном порядке, но в соответствии с иерархии начиная с нижнего модуля (package_3) и заканчивая верхним (package_1)
4. 1,2,3,0,1 — кстати говоря, такого варианта у вас нет, видимо опечатка
5. В stdout ничего не выведется, но процесс завершится успешно — но за такой код я бы наказывал
6. 2
7. 8 14 — строго говоря, программисты на Го вряд ли должны знать ширину китайских иероглифов в UTF-8. Тут скорее важно, что сами ответы будут разные при итерации по символам и по байтам.
+2
Почти всё верно) по ответам:
3. дополнение
4. iota соответствует индексу ConstSpec внутри const-блока, поэтому второе использование в том же блоке не сбрасывает значение в 0.
5. На этот пример вдохновил доклад Пайка :)
8. Полностью согласен, главное знать в чём отличие)
3. дополнение
4. iota соответствует индексу ConstSpec внутри const-блока, поэтому второе использование в том же блоке не сбрасывает значение в 0.
5. На этот пример вдохновил доклад Пайка :)
8. Полностью согласен, главное знать в чём отличие)
0
Скрытый текст
1) передача слайса значением. Изменить данные мы конечно сможем, но длинну нет, а она 0.
2) никогда не использовал тройную запись, могу только предположить, что размерность 4 будет меньше длинны здесь: [::4]
3) конечно, иерархия должна присутствовать, иначе мы рискуем использовать подпакет, который не инициализирован.
4) iota сбрасывается каждый блок const, а он тут один.
5) в stdout, собственно, ничего и не выводим. Но это ж не причина для паники)
6) тут и объяснять ничего не надо, достаточно заменить return x на return, для тех, кто не заметил именованные возвратные значения
7) да кто их знает, сколько байт один иероглиф займет?)
2) никогда не использовал тройную запись, могу только предположить, что размерность 4 будет меньше длинны здесь: [::4]
3) конечно, иерархия должна присутствовать, иначе мы рискуем использовать подпакет, который не инициализирован.
4) iota сбрасывается каждый блок const, а он тут один.
5) в stdout, собственно, ничего и не выводим. Но это ж не причина для паники)
6) тут и объяснять ничего не надо, достаточно заменить return x на return, для тех, кто не заметил именованные возвратные значения
7) да кто их знает, сколько байт один иероглиф займет?)
+1
Изменить данные мы конечно сможем, но длинну нет, а она 0.
Но, кстати, мы можем таки получить доступ к данным:
fmt.Printf("%v %p\n", arr[:1], &arr)
+1
А если так?)
play.golang.org/p/VUwd0G21182
play.golang.org/p/VUwd0G21182
0
Спасибо, вот вам в благодарность тоже задачка:
package main
import "fmt"
func main() {
for i := 0; i < 3; i++ {
defer func() {
fmt.Println(i)
}()
}
}
+3
Чтобы ваш код работал так, как возможно, предполагается (ну на первый взгляд), надо после инициализации цикла добавить i:=i, а ещё лучше вот так:
package main
import "fmt"
func main() {
for i := 0; i < 3; i++ {
defer func(i int) {
fmt.Println(i)
}(i)
}
}
0
Думаю в этом и фишка, что код работает не так как кажется на первый взгляд…
0
А ещё лучше просто вот так:
Потому что аргументы для вызова функции вычисляются на момент вызова defer
package main
import "fmt"
func main() {
for i := 0; i < 3; i++ {
defer fmt.Println(i)
}
}
Потому что аргументы для вызова функции вычисляются на момент вызова defer
+1
Пожалуйста) ждите след. поста с задачками для PHP)
+1
Отложенные ф-ции выполняются после возвращения из основной, т.е. сначала будет выполнено
return 2
(x = 2), а затем x++.0
golang.org/ref/spec#Return_statements
A «return» statement that specifies results sets the result parameters before any deferred functions are executed.
0
Sign up to leave a comment.
Avito Quiz: Golang