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,相当标准。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...