一尘不染

Gomt中fmt.Println的实现细节

go

考虑这段代码

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参考 (使用&),以得到正确的答案,否则我们会回来的对象?

  2. PrintlnGo 如何运作?我的意思是它如何知道应将哪种格式应用于不同类型?


阅读 282

收藏
2020-07-02

共1个答案

一尘不染

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