Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 18 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
18
Dung lượng
111,34 KB
Nội dung
ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA KHOA HỌC & KỸ THUẬT MÁY TÍNH LẬP TRÌNH NÂNG CAO (CO2039) TIỂU LUẬN TÌM HIỂU VỀ GOLANG GVHD: Trương Tuấn Anh SV: Lương Hồng Tiến Đạt – 2012924 Tp Hồ Chí Minh, Tháng 5/2022 Trường Đại Học Bách Khoa Tp.Hồ Chí Minh Khoa Khoa Học & Kỹ Thuật Máy Tính Mục lục LỜI MỞ ĐẦU NỘI DUNG 2.1 Một số đặc điểm Go 2.2 Cách sử dụng lập trình với ngơn ngữ Golang 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.2.7 2.2.8 2.2.9 2.2.10 2.2.11 2.2.12 2.3 Điểm mạnh, điểm yếu Golang 2.3.1 2.3.2 KẾT LUẬN Tài liệu Tiểu luận mơn Lập trình nâng cao - Niên khóa 2021-2022 Trang 1/15 Cài đặ Synta Kiểu d Xử lý Array Slices Câu lệ Vòng Hàm Struct Map Gorou Ưu Nhượ Trường Đại Học Bách Khoa Tp.Hồ Chí Minh Khoa Khoa Học & Kỹ Thuật Máy Tính LỜI MỞ ĐẦU Go hay Golang ngôn ngữ nguồn mở, đa tảng, ngôn ngữ phát triển Google Robert Griesemer, Rob Pike, Ken Thompson vào năm 2007 Với syntax có phần giống C++ lại đơn giản, từ phát triển lên nhiều sử dụng nhiều lập trình viên tồn giới để tạo nên ứng dụng, hệ thống với hiệu cao Hình 1: Logo ngơn ngữ Golang Golang sử dụng cho nhiều mục dích khác nhau, ta kể đến lĩnh vực mà sử dụng hiệu như: • Sử dụng cho việc phát triển website phía Server (Web development) • Sử dụng cho việc phát triển chương trình Network-based tức chương trình chạy mạng lưới giao tiếp với nhiều máy tính khác • Sử dụng cho việc phát triền ứng dụng Enterprise đa tảng • Phát triển Cloud native, tức tiếp cận, xây dựng dự án dựa lợi thể mơ hình điện tốn đám mây Và tiểu luận này, ta tìm hiểu ngôn ngữ Golang, cách sử dụng tiếp cận đưa lợi yếu điểm ngôn ngữ trở nên phổ biến ưa chuộng 2.1 NỘI DUNG Một số đặc điểm Go Ta kể đến đặc điểm bật Golang như: • Go ngơn ngữ lập trình biên soạn (compiled language) Phần mềm viết Go cần biên soạn sử dụng Go compile trước chạy • Với Golang ta thử nghiệm đơn vị, cụ thể ta viết thử nghiệm đơn vị song song với mã bạn, điều giúp bạn hiểu phạm vi mã kiểm tra riêng phần • Golang hỗ trợ xử lý đa luồng multi-threading • Go ngơn ngữ lập trình kiểu tĩnh (hay static type), biến liệu Golang khơng thay đổi suốt chương trình • Với tảng độc lập, Golang giống ngôn ngữ Java, hỗ trợ tính độc lập tảng, mã biên dịch chuyển đổi thành dạng nhị phân nhỏ tốt Mã Golang biên dịch tảng máy chủ ứng dụng bạn làm việc 2.2 2.2.1 Cách sử dụng lập trình với ngơn ngữ Golang Cài đặt sử dụng Golang Như ngơn ngữ lập trình khác, ta cần text editor để viết code compiler để biên dịch Có nhiều lựa chọn cho lập trình viên Để cài đặt ta truy cập vào đường link sau: https://golang.org/dl/ Sau đó, bạn dùng VScode, bạn cài đặt extension Golang chạy chương trình sử dụng Golang Tiểu luận mơn Lập trình nâng cao - Niên khóa 2021-2022 Trang 2/15 Trường Đại Học Bách Khoa Tp.Hồ Chí Minh Khoa Khoa Học & Kỹ Thuật Máy Tính 2.2.2 Syntax Go Trước tiên để nói quy tắc syntax Go, ta xem xét cấu trúc file code Go gồm phần Ta xét ví dụ nội dung file Go đơn giản sau: package main import (" fmt " ) func main () { fmt Println ( " Advanced P r o g r a m m i n g " ) } Listing 1: Ví dụ file code Go đơn giản Và từ ta chia cấu trúc file mã Go gồm phần sau: • Khai báo package (Ta dùng từ khóa package dịng ví dụ trên, chương trình thuộc package main) • Import package cần thiết khác (Ví dụ package fmt import vào dòng ví dụ trên) • ’{}’) Các hàm (Hàm main thực ví dụ trên, code hàm nằm bên cặp ngoặc • Các câu lệnh, biểu thức: Những câu lệnh Go ngăn cách cách xuống dịng (Phím Enter) dấu ’;’ 2.2.3 Kiểu liệu khai báo biến Tương tự ngôn ngữ khác, Go cung cấp kiểu liệu sau: • int: Kiểu liệu lưu trữ số nguyên • float32 : Kiểu liệu lưu trữ số thực 32 bits • string: Kiểu liệu lưu trữ chuỗi ký tự, ngăn cách dấu ngoặc kép • bool: Kiểu liệu lưu trữ giá trị logic: true false Ngồi cịn kiểu liệu khác uint, byte, rune, Và tiếp theo, để khai báo biến ta sử dụng hai cách sau: • Sử dụng từ khóa var theo syntax: var = • Sử dụng ":=" theo sau giá trị biến, từ compiler infer type biến gán, sử dụng cách này, bắt buộc ta phải đưa trị gán Ta lấy đoạn chương trình ví dụ: package main import " fmt " func var name string = " Luong Dat " // Type is var var num c, fmt Println ( name ) fmt Println ( address ) fmt Println (a , b , c ) fmt Println ( num ) fmt Println (c , d ) } main () 10 11 12 13 14 15 addres a, b, 811 := d := Listing 2: Ví dụ khai báo biến Tiểu luận mơn Lập trình nâng cao - Niên khóa 2021-2022 Trang 3/15 Trường Đại Học Bách Khoa Tp.Hồ Chí Minh Khoa Khoa Học & Kỹ Thuật Máy Tính Ở ví dụ đưa ví dụ cách khai báo sử dụng từ khóa var cho biến, khai báo không cần value hay khai báo lúc nhiều biến khai báo sử dụng inferring biến nhiều biến Ta thu kết sau (với biến khơng có initial value khởi tạo giá trị mặc định, ví dụ string mặc định "", int mặc định 0, bool mặc định false): Luong Dat 8117 811 World ! Ngoài ra, Go hỗ trợ việc khai báo từ khóa const, biến biến read-only thay đổi giá trị, ta khai báo ví dụ sau: package main import (" fmt " ) const PI = 3.14 func main () { fmt Println ( PI ) } Listing 3: Ví dụ Ta nhận kết quả: 3.14 2.2.4 Xử lý output hình Để đưa kết console, ta sử dụng ba hàm cung cấp package fmt sau: • Print(): Để in biến truyền vào hàng, muốn xuống hàng sử dụng thêm " n" • Println(): Tương tự Print() hàm in biến cách space trống xuống hàng in hết • Printf(): In theo định dạng tùy chỉnh dựa vào thêm vào formatting verbs như: - %v: in giá trị biến - %T : in kiểu liệu biến - %b: in theo dạng binary - Ngồi cịn có nhiều formatting verbs khác %o, %#v, package main import (" fmt " ) func var main () i, j { string = " Hello " , fmt Print (i , j , "\n" ) fmt Println (i , j ) fmt Printf ( "In i = %v, co type la %T " , i , i ) } 10 Listing 4: Ví dụ lệnh in Ta nhận kết quả: HelloWorld Hello World In i = Hello , co type la string Tiểu luận mơn Lập trình nâng cao - Niên khóa 2021-2022 Trang 4/15 Trường Đại Học Bách Khoa Tp.Hồ Chí Minh Khoa Khoa Học & Kỹ Thuật Máy Tính 2.2.5 Array Với Go, để sử dụng mãng, ta cần khai báo mãng theo hai cách sau: var = [] := [] Nếu length không nêu rõ length infer từ values Ta xem ví dụ sau: package main import (" fmt " ) func var b := fmt Println ( a ) fmt Println ( b ) } main () { a = [ ] int {1 ,2 ,3} [ ] int {5 ,10 ,15 ,20} Listing 5: Ví dụ khai báo mãng Ta nhận kết quả: [123] [5 10 15 20] Và để truy cập vào phần tử mãng theo index, ta sử dụng syntax tương tự với C+ +, thơng qua ta thay đổi giá trị phần tử đó, ví dụ sau: package main import (" fmt " ) func main () { nums := [3] int {8 , 11 , 22} fmt Println ( nums [2]) nums [2] = 100 fmt Println ( nums ) } Listing 6: Ví dụ truy cập phần tử mãng Ta nhận kết sau: 22 [8 11 100] Ngoài ra, ta lấy độ dài mãng thơng qua hàm len(), ví dụ: package main import (" fmt " ) func a b main () { := [5] string { "x" , "y" , "z" , "t" ,"k" } := [ ] int {3 ,5 ,7 ,9} fmt Println ( len ( a ) ) 9fmt Println ( len ( b ) ) 10 } Listing 7: Ví dụ hàm len() Ta nhận kết sau: 2.2.6 Slices Tương tự Array Slices dùng để lưu trữ mãng phần tử, điểm khác biệt với Slices ta thay đổi kích thước nó, ta tạo Slice thơng qua cách: Tiểu luận mơn Lập trình nâng cao - Niên khóa 2021-2022 Trang 5/15 Trường Đại Học Bách Khoa Tp.Hồ Chí Minh Khoa Khoa Học & Kỹ Thuật Máy Tính • Sử dụng dạng syntax [] • Tạo Slice từ Array • Sử dụng hàm make() với syntax: := make([], , ) Khi sử dụng slices, ta sử dụng hàm len() để lấy số phần tử chứa Slice cap() để lấy số phần tử tối đa mà slice đạt trước grow Ta lấy ví dụ việc tạo slice sử dụng hàm sau: package main import (" fmt " ) func a fmt Printf ( "a= %v\n" , a ) fmt Printf ( " length = %d\n" , len ( a ) ) fmt Printf ( " capacity = %d\n" , cap ( a ) ) main () { := [] string { "SG" , "TS" , "LG" , "TD"} // Create slice array1 := [6] int {10 , 11 , 12 , 13 , 14 , 15} b := array1 [2:4] // Create slice from an array 12 fmt Printf ( "b= %v\n" , b ) 13 fmt Printf ( " length = %d\n" , len ( b ) ) 14 fmt Printf ( " capacity = %d\n" , cap ( b ) ) 10 11 15 16 20 c := make ([] int , , 10) // Create slice 17 fmt Printf ( "c= %v\n" , c ) 18 fmt Printf ( " length = %d\n" , len ( c ) ) 19 fmt Printf ( " capacity = %d\n" , cap ( c ) ) } with make () Listing 8: Ví dụ slice Ta nhận kết sau: a = [ SG TS LG TD ] length capacity b = [12 length capacity c = [0 0 0] length capacity = = = =4 13] =4 = 10 Thực chất, Slice tham chiếu đến Array, mơ tả phần (hoặc tồn bộ) Array Nó có kích thước động nên thường sử dụng nhiều Array Để truy xuất, thay đổi giá trị phần tử slice ta thực tương tự array Và đề cập trên, slice thay đổi kích thước, thêm bớt phần tử nối slice thông qua hàm append() ví dụ sau: package import (" fmt " ) func 10 11 a a := [] int {1 , = append (a , b c := [] int {4 , := append (a , fmt Printf ( "a=%v\n" , a ) fmt Printf ( "c=%v\n" , c ) main () } Ta nhận kết sau: a =[1 c =[1 Tiểu luận mơn Lập trình nâng cao - Niên khóa 2021-2022 Trang 6/15 Trường Đại Học Bách Khoa Tp.Hồ Chí Minh Khoa Khoa Học & Kỹ Thuật Máy Tính 2.2.7 Câu lệnh điều kiện câu lệnh switch Syntax câu lệnh điều kiện if Golang tương tự với ngôn ngữ C++ if { / code to be executed if condition is true }else { / code to be executed if condition is false } Ta lấy ví dụ sau để thấy nhiều cách sử dụng if else: package main import (" fmt " ) func else { main () { temp := 45 if ( temp < 18) { fmt Println ( "a") } fmt Println ( "b") } 10 11 12 if ( temp > 100) { fmt Println ( "c") } else if ( temp > 50) { 15 fmt Println ( "d") } else { 17 fmt Println ( "e") } } 13 14 16 18 19 Listing 10: Ví dụ câu lệnh if Ta nhận kết sau: b e Ngoài Golang cung cấp câu lệnh switch case để so sánh giá trị với giá trị khác thực câu lệnh theo ý người lập trình với syntax sau: switch { case x: / code block case y: / code block case z: default: / code block } Câu lệnh so sánh giá trị expression với giá trị case, câu lệnh phần case chạy Phần default optimal, có khơng Ta lấy ví dụ sau: package main import (" fmt " ) func main () { num := switch num { case 1: 10 fmt Println ( " One" ) case 2: 11 12 13 14 15 fmt Println ( " Two" ) case 3: fmt Println ( " Three " ) } } Listing 11: Ví dụ câu lệnh switch Tiểu luận mơn Lập trình nâng cao - Niên khóa 2021-2022 Trang 7/15 Trường Đại Học Bách Khoa Tp.Hồ Chí Minh Khoa Khoa Học & Kỹ Thuật Máy Tính Ta nhận kết sau: Two 2.2.8 Vòng lặp Để sử dụng vịng lặp Go, ta sử dụng for (Khơng có while) thơng qua syntax sau: for ; ; { // code to be executed for each iteration } • : Để khởi tạo giá trị biến đếm • : Điều kiện tiếp tục vịng lặp sau lần lặp • : Cập nhật giá trị biến đếm sau lần lặp Ta lấy ví dụ sau: package main import (" fmt " ) func for fmt Print (i , " ") main () { i :=0; i } } Listing 12: Ví dụ câu lệnh for Ta nhận kết sau: 0123456789 Với cách sử dụng for tiếp theo, ta sử dụng từ khóa range sau: for , := { // code to be executed for each iteration } Để hình dung rõ hơn, ta xem ví dụ sau: package main import (" fmt " ) func singers := for fmt Printf ( "%v %v\n" , idx , val ) main () { [3] string {" Selen val := range sing idx , } } Listing 13: Ví dụ câu lệnh for với range Ta nhận kết sau: Selena Gomez Taylor Swift Harry Styles 2.2.9 Hàm Với ngơn ngữ lập trình việc sử dụng function vơ cần thiết, với Go ta định nghĩa hàm thơng qua từ khóa func với syntax cụ thể sau: func ( , , ) { // code to be executed } Ngồi hàm hàm thực thi gọi, sau ví dụ để gọi hàm khơng có tham số có tham số: Tiểu luận mơn Lập trình nâng cao - Niên khóa 2021-2022 Trang 8/15 Trường Đại Học Bách Khoa Tp.Hồ Chí Minh Khoa Khoa Học & Kỹ Thuật Máy Tính package main import (" fmt " ) func d o S o m e t h i n g () { fmt Println ( " Advanced P r o g r a m m i n g is fun !" ) } func p ri nt N am e ( name string ) { fmt Println ( "My name is" , name ) } func main () { 11 d o S o m e t h i n g () 12 p ri nt N am e (" Dat ") 13 p ri nt N am e (" Mason Luong " ) 14 } 10 Listing 14: Ví dụ hàm Ta nhận kết sau: Advanced P r o g r a m m i n g is fun ! My name is Dat My name is Mason Luong Ngồi ta trả giá trị kết hàm, với Go ta cịn đặt trước tên biến lưu kết trả về, trả cần ghi return trống Ta lấy ví dụ hàm hàm khơng đặt tên biến trả hàm có sau: package main package main import (" fmt " ) add ( x int , y int ) int { return x + y } func product ( x int , y int ) ( result result = x * y 10return 11 } 12 func main () { 13 fmt Println ( add (3 , 4) ) 14 fmt Println ( product (3 , 4) ) 15 } func int ) { Listing 15: Ví dụ hàm Ta nhận kết sau: 12 Đặc biệt ta cịn trả lượt nhiều giá trị gán vào biến chương trình, ví dụ sau: package main import (" fmt " ) a d d A n d M u l t i ( x int , y int ) ( res1 int , res2 res1 = x + y 6res2 = x * y return } func int ) { 10 11 func main () { a , b := a d d A n d M u l t i (4 ,5) 12 fmt Println (a , b ) 13 } Listing 16: Ví dụ hàm Ta nhận kết sau: 920 Tiểu luận mơn Lập trình nâng cao - Niên khóa 2021-2022 Trang 9/15 Trường Đại Học Bách Khoa Tp.Hồ Chí Minh Khoa Khoa Học & Kỹ Thuật Máy Tính Trong vài trường hợp, bạn sử dụng hàm trả nhiều giá trị bạn quan tâm đến kết bạn sử dụng dấu "_" để loại bỏ giá trị đi, lấy ví dụ: package main import (" fmt " ) a d d A n d M u l t i ( x int , y int ) ( res1 int , res2 res1 = x + y 6res2 = x * y return } func int ) { 10 11 func main () { _ , b := a d d A n d M u l t i (5 ,6) 12 fmt Println ( b ) 13 } Listing 17: Ví dụ hàm Ta nhận kết sau: 30 2.2.10 Struct Để tạo tập hợp liệu khác nhau, kiểu khác ta sử dụng struct Với Go, ta sử dụng syntax sau để khai báo kiểu mới: type struct { ; ; ; } Sau định nghĩa struct mới, ta khai báo biến thuộc kiểu struct sử dụng, để truy cập vào hay thay đổi liệu struct ta sử dụng operator dấu chấm "." Ta lấy ví dụ sau: package main import (" fmt " ) Singer struct { name string 6genre string 7age int } type 10 func 11 12 main () { var s1 Singer var s2 Singer 13 14 15 16 17 // s1 s p e c i f i c a t i o n s1 name = " Selena Gomez " s1 genre = " Pop " s1 age = 29 18 19 20 21 22 // s2 s p e c i f i c a t i o n s2 name = " Taylor Swift " s2 genre = " Folk " s2 age = 33 23 24 25 26 27 // Access and print s1 info fmt Println ( " Name : " , s1 name ) fmt Println ( " Genre : " , s1 genre ) fmt Println ( " Age: " , s1 age ) 28 29 30 31 32 // Access and print s2 info fmt Println ( " Name : " , s2 name ) fmt Println ( " Genre : " , s2 genre ) fmt Println ( " Age: " , s2 age ) Tiểu luận mơn Lập trình nâng cao - Niên khóa 2021-2022 Trang 10/15 Trường Đại Học Bách Khoa Tp.Hồ Chí Minh Khoa Khoa Học & Kỹ Thuật Máy Tính } 33 Listing 18: Ví dụ struct Ta nhận kết sau: 2.2.11 Name : Genre : Age : Name : Genre : Age : Selena 29 Taylor Folk 33 Map Một cấu trúc liệu có lẽ phổ biến sử dụng nhiều map, với map ta lưu liệu theo cặp : Nhờ vào mà việc truy cập phần tử theo key dễ dàng Với Go, ta tạo map theo nhiều cách khác nhau, ta xem ví dụ sau để thấy cách tạo map: package main import (" fmt " ) func main () { // Create map with var var a = map [ string ] string { " brand ": " Gucci " , " season ": " Winter " , " year " : " 2022 " } // Create map with := b := map [ string ] int {"LA" : , "NY" : , " WDC " : , "TX" : 4} // Create map with make var c = make ( map [ string ] string ) // The map is empty now 11 c [ " brand "] = "LV" 12 c [ " season " ] = " Summer " 13 c [ " year "] = " 2021 " 10 14 fmt Printf ( "a = %v\n" , a ) fmt Printf ( "b = %v\n" , b ) fmt Printf ( "c = %v\n" , c ) } 15 16 17 18 Listing 19: Ví dụ khai báo map Ta nhận kết sau: a = map [ brand : Gucci season : Winter year :2022] b = map [ LA :1 NY :2 TX :4 WDC :3] c = map [ brand : LV season : Summer year :2021] Sau ta access vào map ta tìm hiểu delete() để xóa element map cách truyền vào map_name va key cần xóa, ta ví dụ sau: package main import (" fmt " ) func main () var a = fmt Println ( a ) delete (a , " year " ) fmt Println ( a ) } { map [ string ] string Listing 20: Ví dụ delete() map Ta nhận kết sau: map [ brand : Gucci season : Winter year :2022] map [ brand : Gucci season : Winter ] Ngồi ta cịn kiểm tra xem key map có tồn element hay khơng, ví dụ: package main import (" fmt " ) Tiểu luận mơn Lập trình nâng cao - Niên khóa 2021-2022 Trang 11/15 Trường Đại Học Bách Khoa Tp.Hồ Chí Minh Khoa Khoa Học & Kỹ Thuật Máy Tính func var main () a { = map [ string ] string { " brand ": " Gucci " , " se val1 , ok1 := a [ " brand "] // Checking for existing key and its value val2 , _, ok2 := a [ " color := a [" year "] ok3 10 11 12 13 14 fmt Println ( val1 , ok1 ) fmt Println ( val2 , ok2 ) fmt Println ( ok3 ) } Listing 21: Ví dụ việc kiểm tra key map Ta nhận kết sau: Gucci true false true 2.2.12 Goroutine Channels Một đặc điểm xem mạnh Golang Golang hỗ trợ việc lập trình concurrency (lập trình đồng bộ) mạnh mẽ Và với phần ta tìm hiểu khái niệm Go Goroutine Channels, ta hiểu định nghĩa Goroutine cách tổng quát sau: "Goroutine function chạy đồng thời với function khác" Vậy Go xử dụng chế để sử dụng Gorountine cho việc lập trình đồng thời, cụ thể ta hiểu sau: Một function tồn cách đa luồng với Goroutine khác không gian nhớ, điều khiển sử dụng để quản lý Goroutine phân phối chúng vào xử lý logic gắn xử lý logic với thread hệ thống tạo trước để thực thi Goroutine Nói cách khác, thread hệ thống xử lý nhóm Goroutine điều phối thơng qua xử lý logic Với điều khiển quản lý tác vụ đồng thời chế xử lý logic, khó khăn, phức tạp khai báo thread Go xử lý sẵn Để khai báo function sử dụng Routines, ta dùng từ khóa go để hình dung dễ dàng sử dụng Goroutine, ta xét ví dụ sau: package main import ( " fmt " " time " ) 12 13 func f ( from string ) { for i := 0; i < 3; i ++ { fmt Println ( from , ":" , i ) 10 time Sleep ( time Second ) 11 } } func main () { 14 15 16 17 // s y n c h r o n o u s l y go f ( " g o ro u ti ne ") 18 20 19 // To invoke this function in a goroutine , use // ‘go f(s) ‘ This new g or o ut in e will execute 21 // c o n c u r r e n t l y with the calling one 22 f ( " direct " ) 23 24 26 // Our two function calls are running asynchronously in 25 // separate g o r o u t i n e s now Wait for them to finish // ( for a more robust approach , use a [ W a it Gr o up ]( w a i t g r o u p s )) 27 time Sleep ( time Second ) 28 fmt Println ( " done ") // Suppose we // we ’d call Tiểu luận mơn Lập trình nâng cao - Niên khóa 2021-2022 Trang 12/15 Trường Đại Học Bách Khoa Tp.Hồ Chí Minh Khoa Khoa Học & Kỹ Thuật Máy Tính } 29 Listing 22: Ví dụ Goroutine Ta nhận kết sau: direct : g or o ut in e : g or o ut in e : direct : g or o ut in e : direct : done Với cách viết câu lệnh thơng thường thứ tự câu lệnh hàm main chạy theo thứ tự từ xuống dưới, ta sử dụng Gorountine (ở dịng 17) lời gọi hàm dịng 22 f("direct") chạy song song với lời gọi hàm f("goroutine"), lệnh in sử dụng hàm f in không theo thứ tự, dẫn đến kết có chen lẫn direct goroutine Rõ ràng việc sử dụng Goroutine chưa đủ, Goroutines muốn giao tiếp với đồng trình chạy ? Và lý Channels đời Ta có định nghĩa sau: "Channels cung cấp cách thức cho phép goroutines giao tiếp với thực đồng hóa" Ta khai báo Channels thông qua make theo syntax sau: := make(chan ) Khi có channel, ta giao tiếp thông qua syntax để truyền liệu sau: