Go:
ค้นหาความยาวของสตริง
วิธีการ:
ใน Go, สตริงถูกจัดการเป็นลำดับไบต์ที่ไม่สามารถเปลี่ยนแปลงได้ คุณสามารถหาความยาวของสตริงโดยใช้ฟังก์ชันในตัว len()
ซึ่งจะส่งคืนจำนวนไบต์ ซึ่งอาจไม่ได้หมายความว่าเป็นจำนวนตัวอักษรเสมอไป นี่คือวิธีการใช้:
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
// ใช้ len() เพื่อหาความยาวไบต์
str := "Hello, 世界"
byteLength := len(str)
fmt.Println("ความยาวไบต์:", byteLength) // ผลลัพธ์: ความยาวไบต์: 13
// เพื่อหาจำนวนตัวอักษรหรือ runic อย่างถูกต้องในสตริง
runeLength := utf8.RuneCountInString(str)
fmt.Println("ความยาว rune:", runeLength) // ผลลัพธ์: ความยาว rune: 9
}
วิธีแรกโดยใช้ len()
อาจไม่ได้ให้ผลลัพธ์ที่คาดหวังเสมอไป เนื่องจากมันนับไบต์ สำหรับสตริงที่มีตัวอักษรที่ไม่ใช่ ASCII (เช่น “世界”), RuneCountInString
จากแพ็กเกจ unicode/utf8
ควรถูกใช้แทนเพื่อนับจุดรหัส Unicode อย่างแม่นยำ
ภาพลึก
ก่อน Go 1, ไม่มีการแบ่งแยกที่ชัดเจนสำหรับการจัดการสตริงเป็นลำดับของไบต์หรือลำดับของตัวอักษร หลังจาก Go 1, การยอมรับ UTF-8 เป็นแบบแผนการเข้ารหัสสตริงทำให้ต้องมีวิธีการที่ชัดเจนยิ่งขึ้น ฟังก์ชัน len()
ทำงานได้อย่างสมบูรณ์สำหรับสตริง ASCII ที่ตัวอักษรถูกแทนที่ด้วยไบต์เดียว อย่างไรก็ตาม เมื่อโปรแกรม Go เริ่มมีความเป็นสากลมากขึ้น และความจำเป็นที่ต้องรองรับภาษาและชุดตัวอักษรที่หลากหลายเพิ่มขึ้น วิธีการง่ายๆ ของ len()
ก็เริ่มแสดงข้อจำกัด
การแนะนำและการใช้ utf8.RuneCountInString()
ตอบสนองข้อจำกัดเหล่านี้โดยการให้วิธีการนับตัวอักษร Unicode (rune ตามศัพท์ของ Go) ที่แท้จริง วิธีนี้รับประกันว่าการคำนวณความยาวไม่ขึ้นกับรายละเอียดการเข้ารหัสของ UTF-8 ที่ตัวอักษรอาจครอบคลุมหลายไบต์
วิธีการทางเลือกในการเดินทางและจัดการกับสตริง ที่มากกว่าเป็นไปตามจริยธรรมของความเข้ากันได้และประสิทธิภาพของ Go อาจเกี่ยวข้องกับการจัดการสตริงเป็นชิ้นส่วนของ rune อย่างไรก็ตาม วิธีนี้ต้องการขั้นตอนการแปลงและไม่ได้แก้ไขความซับซ้อนทั้งหมดของ Unicode (เช่น ตัวอักษรที่รวมกัน)
โดยสรุป แม้ว่า len()
จะเหมาะสมสำหรับความยาวไบต์และมีประสิทธิภาพสำหรับข้อความ ASCII, utf8.RuneCountInString()
เป็นตัวเลือกที่เชื่อถือได้มากขึ้นสำหรับแอปพลิเคชันที่สามารถใช้งานได้ทั่วโลก อย่างไรก็ตาม นักพัฒนาควรเข้าใจเกี่ยวกับการตัดสินใจในเรื่องของประสิทธิภาพและการใช้หน่วยความจำที่เกี่ยวข้องกับทางเลือกเหล่านี้