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
s เท่านั้นคุณสามารถใช้strings.Join()
ตำแหน่งที่คุณสามารถระบุตัวคั่นแบบกำหนดเองstring
(เพื่อวางระหว่างสตริงเพื่อเข้าร่วม)
ลองเหล่านี้ในไปสนามเด็กเล่น
2. สตริงที่ซับซ้อน (เอกสาร)
หากสตริงที่คุณพยายามสร้างมีความซับซ้อนมากขึ้น (เช่นข้อความอีเมลหลายบรรทัด) fmt.Sprintf()
จะสามารถอ่านได้และมีประสิทธิภาพน้อยลง (โดยเฉพาะถ้าคุณต้องทำหลายครั้ง)
สำหรับวันนี้ห้องสมุดมาตรฐานให้แพคเกจและtext/template
html/template
แพคเกจเหล่านี้ใช้แม่แบบที่ขับเคลื่อนด้วยข้อมูลเพื่อสร้างเอาต์พุตแบบข้อความ html/template
ใช้สำหรับสร้างเอาต์พุต HTML ที่ปลอดภัยต่อการฉีดรหัส มันมีอินเตอร์เฟสเหมือนกับแพ็คเกจtext/template
และควรใช้แทนtext/template
เมื่อใดก็ตามที่เอาต์พุตเป็น HTML
การใช้template
แพคเกจนั้นคุณจะต้องให้แม่แบบคงที่ในรูปแบบของstring
ค่า (ซึ่งอาจมาจากไฟล์ในกรณีที่คุณให้ชื่อไฟล์เท่านั้น) ซึ่งอาจมีข้อความคงที่และการกระทำที่ถูกประมวลผลและดำเนินการเมื่อ เอ็นจิ้นประมวลผลแม่แบบและสร้างผลลัพธ์
คุณอาจให้พารามิเตอร์ที่รวม / ทดแทนในแม่แบบคงที่และซึ่งอาจควบคุมกระบวนการสร้างผลลัพธ์ รูปแบบทั่วไปของพารามิเตอร์ดังกล่าวคือstruct
s และmap
ค่าที่อาจซ้อนอยู่
ตัวอย่าง:
ตัวอย่างเช่นสมมติว่าคุณต้องการสร้างข้อความอีเมลที่มีลักษณะดังนี้:
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"},
}
โดยปกติแล้วเอาต์พุตของเทมเพลตจะถูกเขียนไปที่ a io.Writer
ดังนั้นหากคุณต้องการผลลัพธ์ที่เป็น a string
ให้สร้างและเขียนไปที่ a 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
นี้จะเขียนผลโดยตรงกับ ลองนี้บนไปสนามเด็กเล่น