Как получить все определенные типы?

package demo

type People struct {
    Name string
    Age  uint
}

type UserInfo struct {
    Address  string
    Hobby    []string
    NickNage string
}

другой пакет:

import "demo"

в этом пакете, как я могу получить все типы, экспортированные из демонстрационного пакета?


go
person emitle    schedule 27.12.2013    source источник
comment
Чего вы пытаетесь достичь?   -  person Paul Hankin    schedule 28.12.2013
comment
Если вам это нужно программно, вы, вероятно, захотите использовать parser, как говорят ответы ниже. Если вы просто хотите это для своей информации, вы можете использовать команду go doc или godoc.org.   -  person MatrixFrog    schedule 28.12.2013


Ответы (4)


Используя go/importer:

pkg, err := importer.Default().Import("time")
if err != nil {
    fmt.Println("error:", err)
    return
}
for _, declName := range pkg.Scope().Names() {
    fmt.Println(declName)
}

(обратите внимание, это возвращает ошибку на игровой площадке Go).

person 王一帆    schedule 12.08.2019

Go не сохраняет основной список структур, интерфейсов или переменных на уровне пакета, поэтому то, что вы просите, к сожалению, невозможно.

person LinearZoetrope    schedule 27.12.2013

Черт, я надеялся, что ответ Jsor был неправильным, но я не могу найти способ сделать это.

Однако не все потеряно: если у вас есть исходный код для «демонстрации», вы можете использовать пакет parser для получения необходимой информации. Хотя немного хака.

person BraveNewCurrency    schedule 27.12.2013

Вы пришли из какого-то скриптового языка? Это выглядит так.

У Go есть веские причины распространяться, чтобы не допустить проникновения «волшебства» в ваш код.

То, что кажется простым в начале (иметь доступ ко всем структурам, автоматически регистрировать их где-то, «сохранять» код), закончится кошмаром отладки и обслуживания, когда ваш проект станет больше.

Затем вам придется документировать и искать все ваши паршивые соглашения и последствия. Я знаю, о чем говорю, потому что я несколько раз шел по этому пути с ruby ​​и nodejs.

Вместо этого, если вы сделаете все явным, вы получите некоторые функции, такие как переименование структуры People, чтобы позволить компилятору сказать вам, где она используется во всей вашей кодовой базе (а компилятор go работает быстрее вас).

Такие возможности бесценны для отладки, тестирования и рефакторинга.

Кроме того, через несколько месяцев после того, как вы его написали, ваш код будет легко понять вашим коллегам-программистам и вам самим.

person metakeule    schedule 06.03.2014
comment
наличие доступа ко всем структурам не означает, что вы хотите регистрировать их автоматически. Есть причины вроде генерации кода. - person vimdude; 09.03.2015
comment
@vimdude для генерации кода вы можете использовать синтаксический анализатор go, чтобы получить все структуры пакета и использовать флаг go:generate. - person metakeule; 10.03.2015