[Cơ bản] Làm thế nào để có thể append 2 slice trong Golang?
Go
50
golang
49
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.
23 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
18 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 2 năm trước
18 0
White
11 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
11 2
White
8 4
Bài viết liên quan
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
White
44 7
Là một người thường xuyên đọc Quora, có một điểm cá nhân tôi thấy rất ấn tượng ở quora chính là khả năng autocomplete với tốc độ ánh sáng. (Ảnh) ...
huydx viết 6 tháng trước
44 7
{{like_count}}

kipalog

{{ comment_count }}

bình luận

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


White
{{userFollowed ? 'Following' : 'Follow'}}
12 bài viết.
23 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á!