Golang中遇到的一个小问题

Golang中遇到的一个小问题 我对表达式 x+y+z == 890 使用了 parseExpr,它打印出了: &{0xc000060270 7 == 0xc00000c140}

这里的 7 是什么意思? 这些是内存地址吗?由于我没有将 x、y、z 定义为变量,所以它们是空值吗?

3 回复

我明白你关于 binExprTree 的意思了。谢谢。

另外,显然 fmt.Printf("%#v", f) 可以给出每个令牌的详细信息…… 😄

更多关于Golang中遇到的一个小问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你得到的是一个 *ast.BinaryExpr。如果你查看该结构体的定义,会发现第二个字段是 “OpPos”,其类型为 token.Pos,这是源代码中令牌位置的紧凑编码。parser.ParseExpr 函数的文档说明这个位置是未定义的。这些地址并非实际值的地址,而是其他 AST 节点的地址。你可能会在最外层 *ast.BinaryExprX 节点下找到另一个 *ast.BinaryExpr,而在其下(对于 ((x+y)+z) 的情况)可能还有另一个。我不确定 xyz 会是什么。很可能是 *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:第二个=字符

0xc0000602700xc00000c140确实是内存地址,分别指向左右操作数的AST节点。这些是Go运行时分配的堆地址,每次运行都会不同。

即使没有定义变量x、y、z,解析器仍然会创建对应的ast.Ident节点,只是这些标识符的Obj字段为nil,表示未解析的符号引用。

回到顶部