Chuyển đến nội dung chính
Mô-đun 8 · Bài học 2 trong tổng số 537/50 trong khóa học~12 min
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

Go
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.

Go
key, val, ok := strings.Cut("name=Ada", "=")
// "name", "Ada", true

strings.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:

Go
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

Go
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:

Go
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
}
_ = n

Bài tập

tập thể dục#go.m8.l2.e1
Nỗ lực: 0Đang tải…

Tách chuỗi 'a,b,c' trên dấu phẩy và in lát kết quả.

Đang tải trình chỉnh sửa…

Giải pháp khả dụng sau 3 lần thử

tập thể dục#go.m8.l2.e2
Nỗ lực: 0Đang tải…

Chuyển chuỗi '42' thành int bằng strconv.Atoi, xử lý lỗi và in số.

Đang tải trình chỉnh sửa…

Giải pháp khả dụng sau 3 lần thử

Quiz#go.m8.l2.e3
Sẵn sàng

Cách thành ngữ để chuyển đổi số nguyên 42 thành chuỗi "42" là gì?

Go
s := ???(42)
// vogliamo s == "42"
Tùy chọn trả lời