মুদ্রণ ছাড়াই একটি গো স্ট্রিং ফর্ম্যাট করবেন?


381

স্ট্রিং প্রিন্ট না করে গোতে স্ট্রিং ফর্ম্যাট করার কি সহজ উপায় আছে?

আমি করতে পারি:

bar := "bar"
fmt.Printf("foo: %s", bar)

তবে আমি চাই যে ফর্ম্যাট করা স্ট্রিংটি মুদ্রণের পরিবর্তে ফিরে আসুক তাই আমি এটিকে আরও চালিত করতে পারি।

আমি এর মতো কিছু করতে পারি:

s := "foo: " + bar

যখন ফর্ম্যাট স্ট্রিং জটিল হয় তখন এটি পড়া মুশকিল হয়ে যায় এবং এক বা একাধিক অংশের স্ট্রিং না থাকলে এবং প্রথমে রূপান্তর করতে হয় এমন জটিল umbers

i := 25
s := "foo: " + strconv.Itoa(i)

এটি করার একটি সহজ উপায় আছে?

উত্তর:


465

স্প্রিন্টফ যা আপনি খুঁজছেন।

উদাহরণ

fmt.Sprintf("foo: %s", bar)

এটি "তুর অফ গো" এর অংশ হিসাবে ত্রুটি উদাহরণে ব্যবহারের ক্ষেত্রেও দেখতে পাবেন ।

return fmt.Sprintf("at %v, %s", e.When, e.What)

6
% পদার্থ পরে চিঠি আছে? এটি কি% y এবং% q হতে পারে? বা% y এবং% y
ফিলিপ বার্টুজি

17
অক্ষরটি গুরুত্বপূর্ণ, এটি একটি ক্রিয়া বলা হয়, মূলত এটি স্প্রিন্টফকে জানায় যে পরিবর্তনশীলটি কী প্রকারের হয় তবে এটি যদি 65 প্রাপ্ত হয় এবং ক্রিয়াটি% d হয় তবে এটি 65 নম্বরটি মুদ্রণ করবে তবে ক্রিয়াটি% সি হলে এটি অক্ষরটি মুদ্রণ করবে 'এ'। দেখুন: golang.org/pkg/fmt/#hdr- মুদ্রণ
redsalt

2
কেন এটি স্প্রিন্টফ বলা হয়? স্ট্রিং জন্য এস, ফর্ম্যাট জন্য? এটি অদ্ভুত যে মুদ্রণটি ফাংশন নামের অংশ যদি ফাংশনটি স্ক্রিনে আউটপুট না দেয়। এটি আমাকে কিছুক্ষণের জন্য বিভ্রান্ত করেছে ...
jcollum

194

1. সাধারণ স্ট্রিং

"সরল" স্ট্রিংগুলির জন্য (সাধারণত কোন লাইনে ফিট করে) সবচেয়ে সহজ সমাধানটি ব্যবহার করা হয় fmt.Sprintf()এবং বন্ধুরা ( fmt.Sprint(), fmt.Sprintln())। এগুলি স্টার্টার Sলেটার ছাড়াই ফাংশনের সাথে সাদৃশ্যযুক্ত , তবে এই Sxxx()রূপগুলি ফলাফল হিসাবে ফিরে আসেstring স্ট্যান্ডার্ড আউটপুটে মুদ্রণের পরিবর্তে ।

উদাহরণ স্বরূপ:

s := fmt.Sprintf("Hi, my name is %s and I'm %d years old.", "Bob", 23)

ভেরিয়েবলটি sমান দিয়ে শুরু করা হবে:

Hi, my name is Bob and I'm 23 years old.

টিপ: আপনি যদি কেবল বিভিন্ন ধরণের মানগুলিকে একত্রিত করতে চান তবে আপনাকে স্বয়ংক্রিয়ভাবে ব্যবহারের প্রয়োজন হবে না Sprintf()(যার জন্য বিন্যাসের স্ট্রিং দরকার) Sprint()ঠিক যেমনটি হয়। এই উদাহরণটি দেখুন:

i := 23
s := fmt.Sprint("[age:", i, "]") // s will be "[age:23]"

কেবলমাত্র সংক্ষিপ্তকরণের জন্য string, আপনি strings.Join()যেখানে কাস্টম বিভাজক নির্দিষ্ট করতে পারবেন তা ব্যবহার করতে পারেন string(যুক্ত হওয়ার জন্য স্ট্রিংগুলির মধ্যে স্থাপন করতে হবে)।

এগুলি গো খেলার মাঠে চেষ্টা করুন

২. জটিল স্ট্রিং (নথি)

আপনি যে স্ট্রিংটি তৈরি করার চেষ্টা করছেন তা যদি আরও জটিল হয় (যেমন একটি বহু-লাইন ইমেল বার্তা), fmt.Sprintf()কম পঠনযোগ্য এবং কম দক্ষ হয় (বিশেষত যদি আপনাকে এটি বেশ কয়েকবার করতে হয়)।

এর জন্য স্ট্যান্ডার্ড লাইব্রেরি প্যাকেজগুলি সরবরাহ করে text/templateএবং html/template। এই প্যাকেজগুলি পাঠ্য আউটপুট উত্পন্ন করার জন্য ডেটা-চালিত টেম্পলেট প্রয়োগ করে। html/templateকোড ইনজেকশন বিরুদ্ধে নিরাপদ এইচটিএমএল আউটপুট উত্পাদন জন্য। এটি প্যাকেজের মতো একই ইন্টারফেস সরবরাহ করে text/templateএবং text/templateযখনই আউটপুট এইচটিএমএল হয় তার পরিবর্তে ব্যবহার করা উচিত ।

templateমূলত প্যাকেজগুলি ব্যবহার করার জন্য আপনাকে কোনও stringমান আকারে স্ট্যাটিক টেম্পলেট সরবরাহ করতে হয় (যা কেবলমাত্র ফাইলের নাম দিয়ে থাকে এমন একটি ফাইল থেকে উদ্ভূত হতে পারে) যেখানে স্থির পাঠ্য থাকতে পারে এবং যে ক্রিয়াগুলি প্রক্রিয়া করা হয় এবং কার্যকর করা হয় তখন ইঞ্জিন টেম্পলেট প্রক্রিয়া করে এবং আউটপুট উত্পন্ন করে।

আপনি স্ট্যাটিক টেম্পলেট অন্তর্ভুক্ত / প্রতিস্থাপিত এবং আউটপুট উত্পাদন প্রক্রিয়া নিয়ন্ত্রণ করতে পারে যা পরামিতি সরবরাহ করতে পারেন। এই জাতীয় প্যারামিটারগুলির সাধারণ ফর্মগুলি হল structmapমান যা নেস্টেড হতে পারে।

উদাহরণ:

উদাহরণস্বরূপ বলা যাক আপনি ইমেল বার্তাগুলি তৈরি করতে চান যা দেখতে এরকম দেখাচ্ছে:

Hi [name]!

Your account is ready, your user name is: [user-name]

You have the following roles assigned:
[role#1], [role#2], ... [role#n]

এটির মতো ইমেল বার্তা সংস্থা তৈরি করতে, আপনি নিম্নলিখিত স্ট্যাটিক টেম্পলেট ব্যবহার করতে পারেন:

const emailTmpl = `Hi {{.Name}}!

Your account is ready, your user name is: {{.UserName}}

You have the following roles assigned:
{{range $i, $r := .Roles}}{{if $i}}, {{end}}{{.}}{{end}}
`

এবং এটি কার্যকর করার জন্য এর মতো ডেটা সরবরাহ করুন:

data := map[string]interface{}{
    "Name":     "Bob",
    "UserName": "bob92",
    "Roles":    []string{"dbteam", "uiteam", "tester"},
}

সাধারণত টেমপ্লেটগুলির আউটপুট একটিতে লেখা হয় io.Writer, সুতরাং আপনি যদি ফলাফল হিসাবে a চান string, একটি তৈরি করুন এবং লিখুন bytes.Buffer(যা প্রয়োগগুলি io.Writer)। টেমপ্লেট কার্যকর করা এবং ফলাফল হিসাবে string:

t := template.Must(template.New("email").Parse(emailTmpl))
buf := &bytes.Buffer{}
if err := t.Execute(buf, data); err != nil {
    panic(err)
}
s := buf.String()

এর ফলে প্রত্যাশিত আউটপুট হবে:

Hi Bob!

Your account is ready, your user name is: bob92

You have the following roles assigned:
dbteam, uiteam, tester

এটি গো খেলার মাঠে চেষ্টা করুন ।

এছাড়াও মনে রাখবেন যান 1.10, যেহেতু একটি নতুন, দ্রুত, আরো বিশেষ বিকল্প উপলব্ধ করার জন্য bytes.Bufferযা হল: strings.Builder। ব্যবহার খুব অনুরূপ:

builder := &strings.Builder{}
if err := t.Execute(builder, data); err != nil {
    panic(err)
}
s := builder.String()

এই একটি ব্যবহার করে দেখুন যান খেলার মাঠ

দ্রষ্টব্য: আপনি যদি os.Stdoutলক্ষ্য হিসাবে সরবরাহ করেন (যা প্রয়োগ করে io.Writer): আপনি কোনও টেম্পলেট কার্যকরকরণের ফলাফলও প্রদর্শন করতে পারেন :

t := template.Must(template.New("email").Parse(emailTmpl))
if err := t.Execute(os.Stdout, data); err != nil {
    panic(err)
}

এটি ফলাফল সরাসরি লিখতে হবে os.Stdout। এই ব্যবহার করে দেখুন যান খেলার মাঠ


2

আপনার ক্ষেত্রে, আপনার বিন্যাসের স্ট্রিংয়ের জন্য স্প্রিন্টফ () ব্যবহার করতে হবে।

func Sprintf(format string, a ...interface{}) string

একটি ফর্ম্যাট নির্দিষ্টকারক অনুযায়ী স্প্রিন্টফ ফর্ম্যাটগুলি এবং ফলাফলটি স্ট্রিং প্রদান করে returns

s := fmt.Sprintf("Good Morning, This is %s and I'm living here from last %d years ", "John", 20)

আপনার আউটপুট হবে:

গুড মর্নিং, এটি জন এবং আমি গত ২০ বছর ধরে এখানে বাস করছি।


0

fmt.SprintF ফাংশনটি একটি স্ট্রিং দেয় এবং আপনি স্ট্রিমটি ঠিক একইভাবে ফর্ম্যাট করতে পারেন যেভাবে আপনি এফএমটি.প্রিন্টএফ


0

সমর্থন define new Typeসহ আমরা একটি নতুন স্ট্রিং প্রকার কাস্টম করতে পারি Format

package main

import (
    "fmt"
    "text/template"
    "strings"
)

type String string
func (s String) Format(data map[string]interface{}) (out string, err error) {
    t := template.Must(template.New("").Parse(string(s)))
    builder := &strings.Builder{}
    if err = t.Execute(builder, data); err != nil {
        return
    }
    out = builder.String()
    return
}


func main() {
    const tmpl = `Hi {{.Name}}!  {{range $i, $r := .Roles}}{{if $i}}, {{end}}{{.}}{{end}}`
    data := map[string]interface{}{
        "Name":     "Bob",
        "Roles":    []string{"dbteam", "uiteam", "tester"},
    }

    s ,_:= String(tmpl).Format(data)
    fmt.Println(s)
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.