go - golang中fmt.Println的实现细节

标签 go floating-accuracy

考虑这段代码

import (
  "fmt"
  "math/big"
)

func main() {
    var b1,b2,b3,bigSum big.Float

    b1.SetFloat64(25.3)
    b2.SetFloat64(76.2)
    b1.SetFloat64(53.1)

    bigSum.Add(&b1, &b2).Add(&b3, &bigSum)

    fmt.Println(bigSum)   // {53 0 0 1 false [9317046909104082944] 8}
    fmt.Println(&bigSum)  // 129.3
 }

我有两个问题

  1. 为什么我必须将 bigSum 作为 reference 传递(通过使用 &)以获得正确答案,否则我们将取回对象?

  2. Println 在 Go 中如何工作?我的意思是它怎么知道它应该为不同的类型应用哪种格式?

最佳答案

  1. Println 判断值是否实现了 Stringer 接口(interface)。如果是,那么它将调用 String() 来获取格式化值。 big.Float 为指针接收器实现它,因此您必须传递一个引用。否则 Println 将检测到它是一个结构并使用反射打印它的所有字段
  2. Go 是开源的。大家可以自己看看https://golang.org/src/fmt/print.go?#L738它使用类型开关和反射。

关于go - golang中fmt.Println的实现细节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37007494/

相关文章:

cocoa - DBL_MAX & double 型的最大值

go - golang接口(interface)如何转换数组?

json - 从深度嵌套的 JSON 文件中提取值(维基百科 API)

amazon-web-services - Go 代理到 S3 文件适用于本地主机但不适用于生产

c# - 对不同语言/体系结构/操作系统中相对较小的数字取对数

r - 增加观测值数量会使 R 抛出随机系数 - 数值稳定性问题?

math - float 学有问题吗?

go - 如何将断言临时结构键入具体结构

go - 素数程序给出了错误的答案

c - 为什么 "long double"类型的变量产生荒谬的输出,而 "float"和 "double"类型工作正常?