fmt.Println在golang中的实现细节

Implementation details of fmt.Println in golang

考虑这段代码

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
 }

我有 2 个问题

  1. 为什么我必须将 bigSum 作为 reference 传递(通过使用 &)才能得到正确答案,否则我们'会取回一个对象吗?

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

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