Різниця між fmt.Println () та println () у Go


117

Як показано нижче, обидва fmt.Println()і println()дають однаковий вихід у програмі Go:Hello world!

Але: чим вони відрізняються один від одного?

Фрагмент 1, використовуючи fmtпакет;

package main

import (
    "fmt"
)

func main() {
    fmt.Println("Hello world!")
}

Знімок 2, без fmtупаковки;

package main

func main() {
    println("Hello world!")
}

Відповіді:


98

printlnце вбудована функція (під час виконання), яка з часом може бути видалена, поки fmtпакет знаходиться в стандартній бібліотеці, яка зберігатиметься. Дивіться специфікацію на цю тему.

Для розробників мови зручно мати printlnбеззалежні залежності, але шлях - використовувати fmtпакет або щось подібне ( logнаприклад).

Як ви можете бачити в реалізації в print(ln)функції не призначена для навіть віддалено підтримують різні режими виведення і в основному інструмент налагодження.


108

На основі відповіді немо:

println- це функція, вбудована в мову. Він знаходиться в розділі завантаження специфікації . За посиланням:

Поточні реалізації забезпечують кілька вбудованих функцій, корисних під час завантаження. Ці функції задокументовані для повноти, але не гарантовано залишаються в мові. Вони не повертають результату.

Function   Behavior

print      prints all arguments; formatting of arguments is implementation-specific
println    like print but prints spaces between arguments and a newline at the end

Таким чином, вони корисні розробникам, оскільки їм бракує залежностей (вбудованих у компілятор), але не у виробничому коді. Також важливо зауважити, що printі не println доповідати stderr, а неstdout .

Однак сім'я, що надається компанією fmt, будується у виробничому коді. Вони звітуються передбачувано stdout, якщо не вказано інше. Вони більш універсальні ( fmt.Fprint*можуть повідомити будь-якому io.Writer, наприклад os.Stdout, os.Stderrабо навіть net.Connтип.) І не конкретної реалізації.

Більшість пакетів, які відповідають за вихід є fmtяк залежність, таких як log. Якщо ваша програма буде випускати що-небудь у виробництві, fmtшвидше за все, той пакет, який ви хочете.


3

Я бачу різницю тут:

rangeOverIntsAndStrings (1, 5)

func rangeOverIntsAndStrings(args ...interface{}) {
    for _, v := range args {
        println(v)
    }
}

// вихід

(0x108f060,0x10c5358)
(0x108f060,0x10c5360)

проти

func rangeOverIntsAndStrings(args ...interface{}) {
    for _, v := range args {
        fmt.Println(v)
    }
}

// вихід

1
5

1

Що стосується різниці, це є прикладом.

println() друкує точку вказівника на адресу тесту функції.

fmt.Println() друкує адресу функції.


11
Я не розумію, що ти намагаєшся сказати.
П'єро

0

Цікавий приклад:

  netpoll git:(develop)  cat test.go
package main

import "fmt"

func main() {
        a := new(struct{})
        b := new(struct{})
        println(a, b, a == b)

        c := new(struct{})
        d := new(struct{})
        fmt.Printf("%v %v %v\n", c, d, c == d)
}
  netpoll git:(develop)  go run test.go       
0xc000074f47 0xc000074f47 false
&{} &{} true
  netpoll git:(develop)  go run -gcflags="-m" test.go
# command-line-arguments
./test.go:12:12: inlining call to fmt.Printf
./test.go:6:10: new(struct {}) does not escape
./test.go:7:10: new(struct {}) does not escape
./test.go:10:10: new(struct {}) escapes to heap
./test.go:11:10: new(struct {}) escapes to heap
./test.go:12:35: c == d escapes to heap
./test.go:12:12: []interface {} literal does not escape
<autogenerated>:1: .this does not escape
0xc000074f47 0xc000074f47 false
&{} &{} true

Це щось різниця між printlnі fmt.Printf.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.