Go에서 fmt.Println ()과 println ()의 차이점


117

아래 그림과 같이 모두 fmt.Println()println()이동에 동일한 출력을 제공합니다 :Hello world!

하지만 서로 어떻게 다른가요?

fmt패키지를 사용하는 스 니펫 1 ;

package main

import (
    "fmt"
)

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

fmt패키지가 없는 스 니펫 2

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

따라서 개발자에게 유용합니다. 왜냐하면 종속성 (컴파일러에 빌드 됨)이 부족하기 때문이지만 프로덕션 코드에는 없습니다. 또한이 사실 printprintln 기록하고 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)

vs

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

// 출력

1
5

1

차이점은 이것이 예입니다.

println() 함수 테스트의 주소에 대한 포인터 포인트를 인쇄합니다.

fmt.Println() 함수의 주소를 인쇄합니다.


11
나는 당신이 말하려는 것을 이해하지 못합니다.
Pierrot

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입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.