Bài học theo mô-đun (2/5)
`chuỗi` và `strconv`
strings và strconv là hai gói bạn sẽ sử dụng liên tục. Đầu tiên thao tác các chuỗi (tách, cắt, thay thế, tìm kiếm); cái thứ hai chuyển đổi giữa các chuỗi và các kiểu cơ bản (int, float, bool).
strings: các chức năng bạn đạt được hàng ngày
import "strings"
strings.ToUpper("ciao") // "CIAO"
strings.ToLower("CIAO") // "ciao"
strings.Contains("ciao mondo", "mo") // true
strings.HasPrefix("foo.txt", "foo") // true
strings.HasSuffix("foo.txt", ".txt") // true
strings.Index("ciao", "a") // 2 (or -1 if absent)
strings.Count("banana", "a") // 3
strings.Split("a,b,c", ",") // []string{"a","b","c"}
strings.SplitN("a,b,c,d", ",", 2) // []string{"a","b,c,d"}
strings.Join([]string{"a","b"}, "-") // "a-b"
strings.TrimSpace(" ciao\n") // "ciao"
strings.Trim("__ciao__", "_") // "ciao"
strings.ReplaceAll("aaa", "a", "b") // "bbb"
strings.Replace("aaa", "a", "b", 2) // "bba" (limit 2)Ngoài ra còn có các biến thể EqualFold để so sánh không phân biệt chữ hoa chữ thường mà không phân bổ và Cut(s, sep) (before, after, found) để phân tích cú pháp một dòng.
key, val, ok := strings.Cut("name=Ada", "=")
// "name", "Ada", truestrings.Builder để nối trong một vòng lặp
Phép nối s = s + "x" trong vòng lặp sẽ phân bổ trên mỗi lần lặp (chuỗi không thể thay đổi). Đối với văn bản được tạo theo nhiều bước, hãy sử dụng strings.Builder:
var b strings.Builder
for i := 0; i < 1000; i++ {
b.WriteString("x")
}
out := b.String()Phân bổ khấu hao, không có bản sao vô dụng.
strconv: chuyển đổi chuỗi ↔ số/bool
import "strconv"
n, err := strconv.Atoi("42") // int from decimal
s := strconv.Itoa(42) // "42"
b, err := strconv.ParseBool("true")
// Generic versions with base and optional bit-size
i64, err := strconv.ParseInt("ff", 16, 64) // 255
u64, err := strconv.ParseUint("7", 10, 8) // 7
f, err := strconv.ParseFloat("3.14", 64) // 3.14
// Number → string
strconv.FormatInt(255, 16) // "ff"
strconv.FormatFloat(3.14, 'f', 2, 64) // "3.14"
strconv.FormatBool(true) // "true"Atoi/Itoa là các phím tắt tiện dụng; để kiểm soát tốt cơ sở và kích thước, hãy sử dụng ParseInt/FormatInt.
Xử lý lỗi phân tích cú pháp
Atoi trả về (int, error). Lỗi hầu như luôn là *strconv.NumError và bạn có thể so sánh lỗi đó thông qua errors.Is với các công cụ canh gác strconv.ErrSyntax hoặc strconv.ErrRange:
n, err := strconv.Atoi(input)
switch {
case errors.Is(err, strconv.ErrSyntax):
return fmt.Errorf("input non numerico: %q", input)
case errors.Is(err, strconv.ErrRange):
return fmt.Errorf("numero fuori range: %q", input)
case err != nil:
return err
}
_ = nBài tập
Tách chuỗi 'a,b,c' trên dấu phẩy và in lát kết quả.
Giải pháp khả dụng sau 3 lần thử
Chuyển chuỗi '42' thành int bằng strconv.Atoi, xử lý lỗi và in số.
Giải pháp khả dụng sau 3 lần thử
Cách thành ngữ để chuyển đổi số nguyên 42 thành chuỗi "42" là gì?
s := ???(42)
// vogliamo s == "42"