Як отримати всі визначені типи?

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 Playground).

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