Похоже, вы пытаетесь создать свой собственный AST, поскольку правая часть выражения, которое вы дали, не похожа на переменную, в противном случае я предполагаю, что это структура.Однако это тоже не имеет смысла, поскольку было бы буквально нелогично помещать поле с именем red
в структуру с именем color
.Также кажется, что вы пытаетесь получить доступ к переменной пакета, но это также не сработает, потому что первая буква в нижнем регистре означает, что объект не экспортируется.
Оставив все в стороне, я написал небольшой фрагментпросто для соблюдения перечисленных вами условий.
- переменная формы имеет атрибут color.
- переменная цвета имеет атрибут red.
https://play.golang.org/p/gIpctQ1XSgT, Я адаптировал его только для одной строки и паниковал всякий раз, когда условия не соблюдаются для краткости.Не стесняйтесь настроить его под свои нужды.
package main
import (
"go/ast"
"go/format"
"go/parser"
"go/token"
"os"
)
func main() {
expr, err := parser.ParseExpr("shape.color==color.red")
if err != nil {
panic(err)
}
// Checking if the expression was binary.
bExpr, ok := expr.(*ast.BinaryExpr)
if !ok {
panic("expr is not a binary expr.")
}
// If the operation is not “==”, die.
if bExpr.Op != token.EQL {
panic("the op should have been ==.")
}
// Left must be a selector expr, meaning followed with a selector which is “dot” in this case.
left, ok := bExpr.X.(*ast.SelectorExpr)
if !ok {
panic("left should have been a selector expr.")
}
// Same as above.
right, ok := bExpr.Y.(*ast.SelectorExpr)
if !ok {
panic("right should have been a selector expr.")
}
// Checking for attributes.
if left.Sel.Name != "color" {
panic("left should have had a color attr.")
}
// Same as above.
if right.Sel.Name != "red" {
panic("right should have had a red attr.")
}
// Then we finally gofmt the code and print it to stdout.
if err := format.Node(os.Stdout, token.NewFileSet(), expr); err != nil {
panic(err)
}
}