Подтвердить что ты не робот

В чем разница между fmt.Println() и println() в Go?

В Go, если мы хотим что-то напечатать, мы можем сделать это следующим образом:

import "fmt"

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


Но я обнаружил, что можно сделать то же самое без импорта fmt:

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

Может кто-нибудь объяснить, пожалуйста?

4b9b3361

Ответ 1

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

Разработчикам языков удобно иметь println без зависимостей, но можно использовать пакет fmt или что-то подобное (например, log).

Как вы можете увидеть в реализации, функции print(ln) не предназначены даже для удаленной поддержки другого режима вывода и в основном являются инструментом отладки.

Ответ 2

Чтобы построить ответ немо:

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

Что касается разницы, это является примером.

println() выводит указатель на адрес теста функции.

fmt.Println() печатает адрес функции.

Ответ 4

Я вижу разницу здесь:

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