[Cơ bản] Làm thế nào để có thể append 2 slice trong Golang?
Go
39
golang
38
White

Dang Viet Ha viết ngày 07/05/2016

alt text
Trong Golang, slice là một dạng mảng dữ liệu có thể thay đổi size theo nhu cầu sử dụng thực tế. Và khi làm việc với slice chúng ta thường sử dụng hàm append để thêm một hoặc nhiều phần tử mới vào một slice đã có như sau

s := make([]string, 3)
s[0] = "a"
s[1] = "b"
s[2] = "c"

s = append(s, "d")
s = append(s, "e", "f")

Hôm nay, do nhu cầu của dự án tôi cần append hai slice với nhau thành một slice duy nhất. Tôi có tìm đọc vào API của Golang thì thấy rằng Golang không thiết kế một phương thức nào để cho phép chúng ta append 2 slice với nhau cả. Có lẽ không có phương thức này là một quyết định đúng đắn vì bản thân phương thức append đã là một Variadic Functions rồi nên đơn giản chúng ta có thể sử dụng ... để append 2 slice với nhau như sau

s1 := make([]string, 3)
s1[0] = "a"
s1[1] = "b"
s1[2] = "c"

s2 := make([]string, 2)
s2[0] = "e"
s2[1] = "f"

s3 := append(s1, s2...)

fmt.Println("apd:", s)

Kết quả output ra sẽ là apd: [a b c e f]; các bạn có thể chạy thử qua link

Như vậy cũng giống như các ngôn ngữ lập trình khác như Java/Scala, Golang cũng có ... để phân dã một mảng thành các phần tử riêng biệt để truyền thành các tham số riêng lẻ cho các phương thức có nhận tham số truyền vào là một varargs

Qua ví dụ đơn giản này, chúng ta phần nào hiểu được khi nào nên sử dụng varargs khi thiết kế một API. Việc sử dụng ... để phân dã một mảng thành các phần tử đơn lẻ đôi khi rất tiện lợi khi chúng ta không biết rõ được số lượng phần cần truyền vào một Variadic Functions.

Ví dụ tôi cần có một câu lệnh sql và số lượng tham số truyền vào sẽ thay đổi theo một số điều kiện nhất định thì thay bằng việc truyền từng tham số vào Variadic Functions thì chúng ta sẽ sử dụng ... để phân dã một danh sách các tham số cần truyền vào Variadic Functions như sau.

    query := "SELECT * FROM accounts WHERE id IN(?)"
    params := make([]interface{}, 1)
    params[0] = userids
    if len(strings.TrimSpace(name)) != 0 {
        query = query + " AND MATCH(name) AGAINST (?)"
        params = append(params, name)
    }

    if len(strings.TrimSpace(age)) != 0 {
        query = query + " AND age=?"
        params = append(params, age)
    }

    err := db.Raw(query, params...).Scan(&accounts).Error

Như vậy, thì số lượng tham số truyền vào phương thức Raw(query, params...) bằng cách sử dụng ... sẽ luôn luôn chính xác. Nếu không thì mọi chuyện sẽ trở nên phức tạp và đôi khi bạn sẽ gặp phải vấn đề là số lượng tham số sẽ không khớp với số lượng giá trị truyền vào và gây ra lỗi không mong muốn.

Đây chỉ là một kiến thức cơ bản trong hầu hết các ngôn ngữ lập trình, hy vọng là sẽ có ích cho các bạn tìm hiểu về Golang.

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Dang Viet Ha

12 bài viết.
27 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
19 0
Trong thời điểm hiện tại thì JSON REST API vẫn đang rất phổ biến và phổ thông nhất bởi tính dễ sử dụng của nó. Tuy nhiên, các hãng công nghệ lớn lu...
Dang Viet Ha viết hơn 2 năm trước
19 0
White
13 2
Gần đây, tôi có tham gia vào một sự kiện của (Link) và biết được việc sử dụng (Link) để tự động hoá công việc của các sysadmin khá tiện dụng. Hôm n...
Dang Viet Ha viết hơn 2 năm trước
13 2
White
9 4
Dang Viet Ha viết hơn 2 năm trước
9 4
Bài viết liên quan
White
10 2
Makefile thực hiện một số thao tác thường dùng trong Go Khi làm project Go mình thường tạo một file Makefile dạng này: Lưu ý nhớ thay thành tên m...
Huy Trần viết hơn 2 năm trước
10 2
White
16 0
Crawl dữ liệu Crawl là một vấn đề hay gặp trong quá trình làm software. Ví dụ lấy tin tức, tin giảm giá, vé xem phim... là những dạng của crawl. Mộ...
Thach Le viết hơn 2 năm trước
16 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
12 bài viết.
27 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!