为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
素胚勾勒不出你 2021-09-09 21:46:49
在排序示例之一中,他们使用以下代码:package mainimport (    "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 []Personfunc (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 如何以其他方式访问元素。
查看完整描述

1 回答

?
开满天机

TA贡献1786条经验 获得超13个赞

语法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)        // same as *(Point(p))

(*Point)(p)      // p is converted to *Point

<-chan int(c)    // same as <-(chan int(c))

(<-chan int)(c)  // c is converted to <-chan int

func()(x)        // function signature func() x

(func())(x)      // x is converted to func()

(func() int)(x)  // x is converted to func() int

func() int(x)    // 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)               // iota value of type uint

float32(2.718281828)     // 2.718281828 of type float32

complex128(1)            // 1.0 + 0.0i of type complex128

float32(0.49999999)      // 0.5 of type float32

string('x')              // "x" of type string

string(0x266c)           // "♬" of type string

MyString("foo" + "bar")  // "foobar" of type MyString

string([]byte{'a'})      // not a constant: []byte{'a'} is not a constant

(*int)(nil)              // not a constant: nil is not a constant, *int is not a boolean, numeric, or string type

int(1.2)                 // illegal: 1.2 cannot be represented as an int

string(65.0)             // 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 在受限情况下实现此功能。


有关更多详细信息,请参阅链接页面。


查看完整回答
反对 回复 2021-09-09
  • 1 回答
  • 0 关注
  • 164 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信