ค้นหาความยาวของสตริง

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() เป็นตัวเลือกที่เชื่อถือได้มากขึ้นสำหรับแอปพลิเคชันที่สามารถใช้งานได้ทั่วโลก อย่างไรก็ตาม นักพัฒนาควรเข้าใจเกี่ยวกับการตัดสินใจในเรื่องของประสิทธิภาพและการใช้หน่วยความจำที่เกี่ยวข้องกับทางเลือกเหล่านี้