返回接收器本身(Go)的方法的目的是什么?

时间:2009-11-21 16:14:56

标签: methods oop go

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 }

2 个答案:

答案 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的内容。