gpt4 book ai didi

go - 谁在为类型转换定义 Get() 方法? golang 本身?

转载 作者:数据小太阳 更新时间:2023-10-29 03:46:40 26 4
gpt4 key购买 nike

查看: //为值 Binary 定义方法“Get() uint64” func (i Binary) Get() uint64 { 返回 uint64(i)

我们定义了一个方法 Get() 显然 b := Binary(200) 执行它,但是它们之间的联系在哪里。我没有找到 Get() 的定义位置,我假设这个定义覆盖了一个内部定义,或者我错了。


package main

import (
"fmt"
"strconv"
)

// This defines a interface with one method: "String() string"
type Stringer interface {
String() string
}

// Defines an unsigned 64 bit number
type Binary uint64

// Defines a method "String() string" for value Binary
func (i Binary) String() string {
return strconv.FormatUint(i.Get(), 2)
}

// Defines a method "Get() uint64" for value Binary
func (i Binary) Get() uint64 {
return uint64(i)
}

// Main program
func main() {
b := Binary(200) // Create Unsigned value of 200

s := Stringer(b) // Calls interface "Stringer" on "b"

fmt.Println(s.String()) // "s" is an Stringer Interface Type
}

最佳答案

实际上,您已经为 uint64 创建了一个别名,因此当您转换数字 200 时,它的原始值仍然是一个 uint64,但是您的自定义 Binary 类型允许您使用可以在自定义类型上定义的方法来修饰它.

当你转换时,Get() 方法没有被调用,你只是告诉 Go 运行时把它当作一个 Binary 类型而不是一个基本的 uint64。事实上,Get() 方法实际上是多余的,因为您可以将它当作 uint64 来传递,而您没有 String() 方法来满足 stringer 接口(interface),如果您这样做,原始值将被打印出来fmt.Println(b)

fmt.Println(200) //prints 200
fmt.Println(Binary(200)) // also prints 200

正如 JimB 所说,定义的 String 方法不会发生这种情况。

为了进一步澄清,String() 方法正在使用 Get 方法,此类型需要此方法来满足 Stringer 接口(interface)要求。当您使用利用 Stringer 的函数或方法时,这是调用 String() 和 Get() 的地方。如果这仍然是错误的,请尽快在评论中告诉我

关于go - 谁在为类型转换定义 Get() 方法? golang 本身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37286062/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com