Реализация стека на Golang

Сашиндионикус Третий

Пользователь
Пользователь
Апр 7, 2020
5
7
3
Пытаюсь реализовать простейший стек вызовов на Golang. В качестве образца взял код из книги "Грокаем Алгоритмы", код написан на 2Пайтоне.

Python:
def greet(name):
    print "hello, " + name + "!"
    greet2(name)
    print "getting ready to say bye..."
    bye()

def greet2(name):
    print "how are you, " + name + "?"
  def bye():
    print "ok bye!"


Вот моя попытка реализации на Го. Проблема состоит в том, что я не могу понять почему моя вложенная функция bye() не вызывается. Про скоуп уже прочитал, но вменяемых примеров там не было. Так что если вы сможете показать, как мне исправить этот код, я буду вам очень благодарен.


C-подобный:
package main

import "fmt"

func greet(name string) string {
    fmt.Printf("hello, %v !\n", name)
    greet2(name)
    fmt.Printf("getting ready to say bye...\n")
    bye() // тут проблема
    return name
}

func greet2(name string) (func(), string) {
    fmt.Printf("how are you, %v ?\n", name)
    bye := func() { // и тут
        fmt.Println("ok bye!")
    }
    return bye(), name
}

func main()  {
    greet("Sasha")
    greet2("Sasha")
}
 
  • Мне нравится
Реакции: Student

semyon-dev

Пользователь
Пользователь
Апр 18, 2020
2
5
3
Здесь проблема в том что вы пытаетесь вернуть значение которое возвращает функция byе(), а не саму функцию.
C-подобный:
bye := func() { // и тут
        fmt.Println("ok bye!")
    }
    return bye(), name

Можно вернуть её, для этого уберите лишние скобочки:
C-подобный:
bye := func() {
        fmt.Println("ok bye!")
    }
    return bye, name

А внутри функции greet() при вызове greet2() можно принять bye как функцию и вызвать её:

C-подобный:
func greet(name string) string {
    fmt.Printf("hello, %v !\n", name)
    bye, name := greet2(name)
    fmt.Printf("getting ready to say bye...\n")
    bye() // теперь нет проблемы, мы уже приняли функцию как значение выше
    return name
}
 

Форум IT Специалистов