2

这是来自 Golang.org http://golang.org/pkg/sort/

 // By is the type of a "less" function that defines the ordering of its Planet arguments.
 type By func(p1, p2 *Planet) bool

我从未见过这种结构。func 是怎么出现在 type 之后的?这里的类型是什么?

我见过以下结构,但是

type aaaaaa interface { aaa() string }
type dfdfdf struct { } 

没见过像

type By func(p1, p2 *Planet) bool

这在 Go 中怎么可能?type 可以带接口、struct 关键字以外的其他东西吗?

谢谢~!

4

2 回答 2

2

type By func(p1, p2 *Planet) bool is an example of defining a type from a function value.

We can see that by creating a new By value and printing the type using fmt.Printf. In the example below I stumped out Planet as a string - the type doesn't matter for the purposes of the example.

type.go

package main
import(
  "fmt"
  )

type Planet string
type By func(p1, p2 *Planet) bool

func main() {
  fmt.Printf("The type is '%T'", new(By))
  fmt.Println()
}

Output:

mike@tester:~/Go/src/test$ go run type.go
The type is '*main.By'

EDIT: Updated per nemo's comment. The new keyword returns a pointer to the new value. func does not return a function pointer like I had incorrectly thought but instead returns a function value.

于 2013-10-12T04:31:24.690 回答
0

您可以使用任何基本类型定义一个新类型,包括另一个用户定义的类型。

例如,如果您定义一个新类型 File

type File struct {}

用一些方法

func (f *File) Close() { ... }

func (f *File) Size() { ... }

然后,您可以定义一个新类型,称为:

type SpecialFile File

并在其上定义自己的不同方法。

func (f *SpecialFile) Close() { (*File)(f).Close() }

需要注意的重要一点是 SpecialFile 类型没有 Size 方法,即使它的基本类型是 File。您必须将其转换为 *File 才能调用 Size 方法。

如果您想要甚至不在同一个包中的类型,您可以对您甚至不拥有的类型执行此操作。

于 2013-10-14T03:19:08.770 回答