2016-05-03 3 views
2

этот кодКак работает `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 
} 

У меня есть 2 вопроса

  1. Почему я должен пройти bigSum, как ссылка (с помощью &), чтобы получить правильный ответ, иначе мы вернемся объект?

  2. Как работает Println? Я имею в виду, как он знает, какой формат он должен применять для разных типов?

+2

re 2 - используется отражение. выкупить пакет 'reflect'. –

ответ

6
  1. Println определяет, реализует ли значение интерфейс Stringer. Если это произойдет, то он вызовет String(), чтобы получить форматированное значение. big.Float реализует его для приемника указателя, поэтому вам нужно передать ссылку. В противном случае Println обнаружит, что это структура и печать всех его полей с использованием отражения.
  2. Go is open sourced. Вы можете сами убедиться https://golang.org/src/fmt/print.go?#L738 Он использует переключатели типа и отражение.
+0

https://play.golang.org/p/Qy17yy6Q4n – eSniff

Смежные вопросы