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


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

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

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

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

кто-нибудь может объяснить?

3 73

3 ответа:

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

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

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

чтобы основываться на ответе Немо:

println - это функция, встроенная в язык. Он находится в разделе начальной загрузки spec. Из ссылки:

текущие реализации обеспечивают несколько встроенных функций, полезных во время начальной загрузки. Эти функции документированы для полноты но не гарантируется пребывание на языке. Они не возвращают результат.

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 скорее всего пакет, который вы хотите.

что касается разницы, этой пример.

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

fmt.Println() выводит адрес функции.