Программа не компилируется: printInt получает *int вместо int, а printIntPointer — int вместо *int. После исправления аргументов можно показать разницу сохранённого значения и указателя.
Какой вывод появится в консоли (пример 27)
Программа не компилируется: printInt получает *int вместо int, а printIntPointer — int вместо *int. После исправления аргументов можно показать разницу сохранённого значения и указателя.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, какой текст будет напечатан в консоли после выполнения следующей программы.
import (
"fmt"
)
func main() {
a := 10
b := 20
ptr := &b
defer printInt("a", a)
defer printInt("ptr as value", ptr)
defer printIntPointer("ptr as pointer", *ptr)
a = 1010
*ptr = 2020
}
func printInt(name string, val int){
fmt.Printf("%s=%d\n", name, val)
}
func printIntPointer(name string, val *int) {
fmt.Printf("%s=%d\n", name, *val)
}
Ответ
Программа не компилируется: printInt получает *int вместо int, а printIntPointer — int вместо *int. После исправления аргументов можно показать разницу сохранённого значения и указателя.
Замените вызовы на defer printInt("ptr as value", *ptr) и defer printIntPointer("ptr as pointer", ptr). Тогда порядок LIFO даёт:
ptr as pointer=2020
ptr as value=20
a=10
Аргументы defer вычисляются сразу. Сохранённый указатель остаётся прежним, но значение по нему читается при выполнении отложенного вызова.