Golang中遇到的一个小问题
Golang中遇到的一个小问题
我对表达式 x+y+z == 890 使用了 parseExpr,它打印出了:
&{0xc000060270 7 == 0xc00000c140}
这里的 7 是什么意思? 这些是内存地址吗?由于我没有将 x、y、z 定义为变量,所以它们是空值吗?
我明白你关于 binExprTree 的意思了。谢谢。
另外,显然 fmt.Printf("%#v", f) 可以给出每个令牌的详细信息…… 😄
更多关于Golang中遇到的一个小问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你得到的是一个 *ast.BinaryExpr。如果你查看该结构体的定义,会发现第二个字段是 “OpPos”,其类型为 token.Pos,这是源代码中令牌位置的紧凑编码。parser.ParseExpr 函数的文档说明这个位置是未定义的。这些地址并非实际值的地址,而是其他 AST 节点的地址。你可能会在最外层 *ast.BinaryExpr 的 X 节点下找到另一个 *ast.BinaryExpr,而在其下(对于 ((x+y)+z) 的情况)可能还有另一个。我不确定 x、y 和 z 会是什么。很可能是 *ast.Ident,但我不确定它们的 Object 字段会是什么。
在Go语言中,ast.BinaryExpr结构体中的数字7表示操作符的位置(操作符==在源代码中的偏移量)。这是词法分析器记录的操作符在文件中的字节位置,用于错误报告和源代码分析。
示例代码:
package main
import (
"fmt"
"go/ast"
"go/parser"
)
func main() {
expr, err := parser.ParseExpr("x+y+z == 890")
if err != nil {
panic(err)
}
// 类型断言获取BinaryExpr
if binExpr, ok := expr.(*ast.BinaryExpr); ok {
fmt.Printf("操作符位置: %d\n", binExpr.OpPos) // 这里会输出7
fmt.Printf("操作符: %v\n", binExpr.Op) // 输出 EQL (==)
// 验证位置:字符串"x+y+z == 890"中'='的位置
str := "x+y+z == 890"
fmt.Printf("字符串位置7的字符: %c\n", str[7]) // 输出'='
}
}
输出:
操作符位置: 7
操作符: EQL
字符串位置7的字符: =
解释:
- 字符串
"x+y+z == 890"中,字符位置从0开始计数 - 位置0-6:
x+y+z(注意末尾有空格) - 位置7:第一个
=字符 - 位置8:第二个
=字符
0xc000060270和0xc00000c140确实是内存地址,分别指向左右操作数的AST节点。这些是Go运行时分配的堆地址,每次运行都会不同。
即使没有定义变量x、y、z,解析器仍然会创建对应的ast.Ident节点,只是这些标识符的Obj字段为nil,表示未解析的符号引用。

