pkg go / token中的这个函数让我想知道为什么我们需要一个返回接收器本身的方法。
// Token source positions are represented by a Position value.
// A Position is valid if the line number is > 0.
//
type Position struct {
Filename string; // filename, if any
Offset int; // byte offset, starting at 0
Line int; // line number, starting at 1
Column int; // column number, starting at 1 (character count)
}
// Pos is an accessor method for anonymous Position fields.
// It returns its receiver.
//
func (pos *Position) Pos() Position { return *pos }
答案 0 :(得分:5)
这是针对您使用anonymous fields“子类化”职位的情况:
使用类型但没有显式字段名称声明的字段是匿名字段。必须将此类字段类型指定为类型名称T或指定类型名称* T的指针,并且T本身可能不是指针类型。非限定类型名称充当字段名称。
因此,如果你以这种方式对Position进行子类化,那么调用者可能希望能够访问“父”位置结构(例如:如果你想在位置本身上调用String()
,而不是子类型)。 Pos()
返回它。
答案 1 :(得分:5)
在这样的结构中(来自pkg/go/ast/ast.go),下面的token.Position
是一个结构字段,但它没有任何名称:
// Comments
// A Comment node represents a single //-style or /*-style comment.
type Comment struct {
token.Position; // beginning position of the comment
Text []byte; // comment text (excluding '\n' for //-style comments)
}
因此,当它没有名字时,你如何访问它?这就是.Pos()
的作用。给定一个Comment节点,您可以使用token.Position
方法获取其.Pos
:
comment_position := comment_node.Pos ();
此处comment_position
现在包含未命名(“匿名”)结构字段token.Position
的内容。