गो में fmt.Println () और println () के बीच अंतर


117

जैसा कि नीचे चित्रित किया गया है, दोनों fmt.Println()और println()गो में एक ही आउटपुट देते हैं: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

मैं यहां अंतर देख सकता हूं:

रेंजऑवरइंट्सस्ट्रीम (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
मुझे वह नहीं मिला जो आप कहना चाह रहे हैं।
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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.