问题描述
我目前正在学习golang中的type
关键字。
package main
import (
"fmt"
)
type celsius float64
func (c celsius) String() string {
return fmt.Sprintf("%.2f C !!!",c)
}
func main() {
var celVar celsius = 2
fmt.Println(celVar) // prints "2.00 C !!!" // LINE 2
c := celsius(10).String() // LINE 4
fmt.Println(c) // prints "10.00 C !!!"
t := celsius(10) // LINE 7
fmt.Println(t) // prints "10.00 C !!!"
}
-
在第2行中,
fmt.Println(celVar)
为什么打印“ 2.00 C !!!”?
由于celVar
未明确使用String()
方法,因此我希望打印的值为“ 2.00” -
为什么LINE 4和LINE 7的值相同?
再次,LINE 7没有明确使用String()
方法,因此我希望它不应该调用该方法。 -
此外,当
initializing
键入golang时,是否习惯使用celsius(10)
这样的括号?
解决方法
在fmt
包的docs中对此进行了解释:
- 如果操作数实现String()字符串方法,则将调用该方法将对象转换为字符串,然后将该字符串转换为 根据动词的要求进行格式化(如果有)。
有效地,它检查某些内容是否实现了fmt.Stringer接口。
此规则适用于您的第一个和第三个打印语句。格式包首先检查您的类型上是否带有func String() string
方法。既然如此,它将使用此值而不是float64值。
如果要覆盖此默认值,可以将浮点动词传递给fmt
:
fmt.Printf("%f\n",celVar)
>> 2.000000
对于您的最后一个问题:celsius(10)
是type conversion,相当标准。