Отражение на тип структуры от чтения файла .go - PullRequest
0 голосов
/ 14 декабря 2018

Я открываю генератор (иди генерирую) и пытаюсь сгенерировать функцию проверки для моей структуры.

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

проблема в том, что я не могу импортировать свои структуры в код генератора, единственный способ, который я нашел до сих пор, это прочитать .goфайл из генератора и вручную проанализируйте типы, определенные там, используя регулярное выражение

У меня есть что-то вроде

models / models.go:

package models

//go:generate go run ../generator.go -file models.go

type MyStruct struct {
    ...
}

generator.go:

package main

func main() {
    f, err := ioutil.ReadFile(fileName) // I read filename from the flag provided
    ...
    // I parse f to generate my stuff
}

Я бы очень хотел иметь пакет для самоанализа, который бы взял код go в виде строки и дал бы мне некоторую информацию об определенной здесь структуре

Или, возможно, есть способимпортировать файл, вызывающий go: generate, чтобы получить прямой доступ к типам

1 Ответ

0 голосов
/ 14 декабря 2018

Нет необходимости указывать имя файла, этот код делает то же самое:

//go:generate go run ../generator.go -file $GOFILE

С помощью пакета text / template вам не нужно разбирать файл.Очень простой пример будет что-то вроде этого.Это даст вам подсказку:

package main

import (
    "flag"
    "os"
    "text/template"
)

//go:generate go run main.go -name=A
//go:generate go run main.go -name=B
//go:generate go run main.go -name=C

var name = flag.String("name", "test", "name of struct")

var code = `
package main

type Struct{{.}} struct {}

func (s *Struct{{.}} ) Vailadte() bool {
return true
}
`

func main() {
    flag.Parse()
    file, _ := os.Create(*name + ".go")
    defer file.Close()

    tmpl, _ := template.New("test").Parse(code)
    tmpl.Execute(file, *name)
}
...