golang中方法的可用性

问题描述

我目前正在学习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 !!!" 
}
  1. 在第2行中,fmt.Println(celVar)为什么打印“ 2.00 C !!!”?
    由于celVar未明确使用String()方法,因此我希望打印的值为“ 2.00”

  2. 为什么LINE 4和LINE 7的值相同?
    再次,LINE 7没有明确使用String()方法,因此我希望它不应该调用该方法。

  3. 此外,当initializing键入golang时,是否习惯使用celsius(10)这样的括号?

解决方法

fmt包的docs中对此进行了解释:

  1. 如果操作数实现String()字符串方法,则将调用该方法将对象转换为字符串,然后将该字符串转换为 根据动词的要求进行格式化(如果有)。

有效地,它检查某些内容是否实现了fmt.Stringer接口。

此规则适用于您的第一个和第三个打印语句。格式包首先检查您的类型上是否带有func String() string方法。既然如此,它将使用此值而不是float64值。

如果要覆盖此默认值,可以将浮点动词传递给fmt

fmt.Printf("%f\n",celVar)
>> 2.000000

对于您的最后一个问题:celsius(10)type conversion,相当标准。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...