这里是否生成了某种构造函数?

在排序示例之一中,他们使用以下代码:


package main


import (

    "fmt"

    "sort"

)


type Person struct {

    Name string

    Age  int

}


func (p Person) String() string {

    return fmt.Sprintf("%s: %d", p.Name, p.Age)

}


// ByAge implements sort.Interface for []Person based on

// the Age field.

type ByAge []Person


func (a ByAge) Len() int           { return len(a) }

func (a ByAge) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }

func (a ByAge) Less(i, j int) bool { return a[i].Age < a[j].Age }


func main() {

    people := []Person{

        {"Bob", 31},

        {"John", 42},

        {"Michael", 17},

        {"Jenny", 26},

    }


    fmt.Println(people)

    sort.Sort(ByAge(people))

    fmt.Println(people)


}

带有 Sort 的那一行对我来说有点混乱:


sort.Sort(ByAge(people))

ByAge(people) 是否生成某种构造函数来复制传入的数组?我不确定我是否理解新类型 ByAge 如何以其他方式访问元素。


素胚勾勒不出你
浏览 165回答 1
1回答

开满天机

语法foo(expr)where foois a type and expris a type conversion,如规范中所述:转化次数转换是形式为T(x)where Tis a type and x is an expression that can convert to type 的表达式T。转换 = 类型 "(" 表达式 [ "," ] ")" 。如果类型以运算符*or开头<-,或者类型以关键字开头func且没有结果列表,则必须在必要时将其括起来以避免歧义:*Point(p)&nbsp; &nbsp; &nbsp; &nbsp; // same as *(Point(p))(*Point)(p)&nbsp; &nbsp; &nbsp; // p is converted to *Point<-chan int(c)&nbsp; &nbsp; // same as <-(chan int(c))(<-chan int)(c)&nbsp; // c is converted to <-chan intfunc()(x)&nbsp; &nbsp; &nbsp; &nbsp; // function signature func() x(func())(x)&nbsp; &nbsp; &nbsp; // x is converted to func()(func() int)(x)&nbsp; // x is converted to func() intfunc() int(x)&nbsp; &nbsp; // x is converted to func() int (unambiguous)在以下任何一种情况下,常量值x都可以转换为类型T:x可以用一个类型的值来表示T。x是浮点常量,T是浮点类型,并且x可以T使用 IEEE 754 舍入到偶数规则舍入后由 type 的值表示。常数T(x)是四舍五入的值。x是整数常量,T是字符串类型。x在这种情况下适用与非常量相同的规则。转换一个常量会产生一个类型化的常量作为结果。uint(iota)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// iota value of type uintfloat32(2.718281828)&nbsp; &nbsp; &nbsp;// 2.718281828 of type float32complex128(1)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // 1.0 + 0.0i of type complex128float32(0.49999999)&nbsp; &nbsp; &nbsp; // 0.5 of type float32string('x')&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // "x" of type stringstring(0x266c)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// "♬" of type stringMyString("foo" + "bar")&nbsp; // "foobar" of type MyStringstring([]byte{'a'})&nbsp; &nbsp; &nbsp; // not a constant: []byte{'a'} is not a constant(*int)(nil)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // not a constant: nil is not a constant, *int is not a boolean, numeric, or string typeint(1.2)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// illegal: 1.2 cannot be represented as an intstring(65.0)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// illegal: 65.0 is not an integer constant在以下任何一种情况下,非常量值 x 都可以转换为类型 T:x可分配给T。x的类型并T具有相同的基础类型。x的类型并且T是未命名的指针类型,并且它们的指针基类型具有相同的底层类型。x的类型并且T都是整数或浮点类型。x的类型 和T都是复杂类型。x是一个整数或一个字节片或符文,并且T是一个字符串类型。x是一个字符串,T是一个字节或符文的切片。特定规则适用于数字类型之间或与字符串类型之间的(非常量)转换。这些转换可能会改变表示x并产生运行时成本。所有其他转换仅更改类型,而不更改x.没有在指针和整数之间转换的语言机制。包 unsafe 在受限情况下实现此功能。有关更多详细信息,请参阅链接页面。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go