এফএমটি.প্রিন্টলন () এবং প্রিন্টলন () এর মধ্যে পার্থক্য


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ভাষায় নির্মিত একটি ফাংশন। এটা Bootstrapping অধ্যায় রয়েছে বৈশিষ্ট । লিঙ্ক থেকে:

বর্তমান প্রয়োগগুলি বুটস্ট্র্যাপিংয়ের সময় বেশ কয়েকটি বিল্ট-ইন ফাংশন সরবরাহ করে। এই ফাংশনগুলি সম্পূর্ণতার জন্য নথিভুক্ত তবে ভাষায় থাকার গ্যারান্টিযুক্ত নয়। তারা কোনও ফল দেয় না।

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

সুতরাং, তারা বিকাশকারীদের পক্ষে দরকারী, কারণ তাদের নির্ভরতার অভাব রয়েছে (সংকলকটিতে নির্মিত হচ্ছে), তবে উত্পাদন কোডে নয় code এটা খেয়াল করা জরুরী যে গুরুত্বপূর্ণ printএবং println রিপোর্ট stderr, নাstdout

পরিবার সরবরাহ করে fmtতবে প্রযোজনা কোডে নির্মিত। stdoutঅন্যথায় সুনির্দিষ্ট না করা হলে তারা পূর্বানুমতিভাবে প্রতিবেদন করে report এগুলি আরও বহুমুখী (যে কোনওটিতে যেমন fmt.Fprint*রিপোর্ট করতে পারে io.Writer, যেমন os.Stdout, os.Stderrএমনকি কোনও ধরণেরও can 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
আপনি যা বলতে চাইছেন তা আমি পাই না।
পিয়েরোট

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.