Как проверить, существует ли функция в файле go

Есть ли эквивалент в golang для проверки существования функции в файле package/go, как это делается в python.

mymethod in dir(package)

person pretty08    schedule 15.07.2018    source источник
comment
Компилятор сделать это   -  person Uvelichitel    schedule 15.07.2018
comment
Go не поддерживает каталог исполняемых функций. Какую проблему более высокого уровня вы пытаетесь решить?   -  person Cerise Limón    schedule 15.07.2018
comment
Я пытаюсь разобрать и сгладить файл json на основе типа метода сглаживания, переданного в качестве аргумента основному методу, мне нужно проверить, существует ли метод сглаживания в моем пакете go, а затем вызвать его, если он существует.   -  person pretty08    schedule 15.07.2018
comment
Я пытаюсь разобрать и сгладить файл json на основе аргумента, переданного в моем основном методе, мне нужно проверить, существует ли функция на момент переданного аргумента в моем пакете go, а затем вызвать ее, если она существует.   -  person pretty08    schedule 15.07.2018
comment
Типичный подход заключается в том, чтобы указать функцию, используя значение функции (поэтому нет необходимости искать ее, просто вызовите ее) или найти функцию в карте, поддерживаемой приложением. Это поможет, если вы покажете код Go, который вы пробовали до сих пор.   -  person Cerise Limón    schedule 15.07.2018


Ответы (2)


Похоже, что из этого Пост, что напрямую невозможен.

Вы всегда можете создать свой собственный пакет для поиска файлов пакета и проверки существования метода, как описано выше в первом ответе на сообщение. .

person waymobetta    schedule 15.07.2018
comment
Но для этого требуется доступ к исходному коду во время выполнения, что не является обычным случаем. - person Adrian; 16.07.2018
comment
@ Адриан Верно, но то же самое должно быть и с использованием Python. Я [вероятно, неправильно] предполагаю, что у нас есть доступ к исходному коду, а не только к скомпилированному пакету. - person waymobetta; 16.07.2018
comment
Это всегда так в питоне, это интерпретируемый язык. Источник - это то, что выполняется. Это не относится к Go. - person Adrian; 16.07.2018

Основываясь на ваших комментариях, похоже, что вы можете просто использовать карту, содержащую доступные функции. Вот полный пример:

package main

import (
    "flag"
    "fmt"
    "os"
)

func main() {
    var option string
    var data string

    flag.StringVar(&option, "option", "default", "The option to choose from")
    flag.StringVar(&data, "data", "", "The data to use")

    flag.Parse()

    options := map[string]func(string) string{
        "foo": func(data string) string {
            fmt.Println("do something with data using option foo")
            return data
        },
        "bar": func(data string) string {
            fmt.Println("do something with data using option bar")
            return data
        },
        "default": func(data string) string {
            fmt.Println("do something with data using default option")
            return data
        },
    }

    method, found := options[option]
    if !found {
        fmt.Println("option is not available")
        os.Exit(1)
    }

    result := method(data)
    fmt.Println(result)
}

Выход

$ go run main.go -data hello -option foo
do something with data using option foo
hello

$ go run main.go -data hello -option whatever
option is not available

$ go run main.go -data hello
do something with data using default option
hello
person Miguel Mota    schedule 16.07.2018