Какой вывод появится в консоли (пример 27)

Программа не компилируется: printInt получает *int вместо int, а printIntPointer — int вместо *int. После исправления аргументов можно показать разницу сохранённого значения и указателя.

Короткий ответ

Что ответить на собеседовании

Программа не компилируется: 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 вычисляются сразу. Сохранённый указатель остаётся прежним, но значение по нему читается при выполнении отложенного вызова.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее