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

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