3

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 }
4

2 回答 2

7

在这样的结构中(来自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

于 2009-11-21T17:11:44.293 回答
6

这适用于您使用匿名字段来“子类化”职位的情况:

使用类型声明但没有显式字段名称的字段是匿名字段。这样的字段类型必须指定为类型名称 T 或指向类型名称 *T 的指针,并且 T 本身可能不是指针类型。非限定类型名称充当字段名称。

因此,如果您以这种方式对 Position 进行子类化,调用者可能希望能够访问“父”位置结构(例如:如果您想调用String()位置本身,而不是子类型)。Pos()返回它。

于 2009-11-21T17:11:13.217 回答