1. Trang chủ
  2. » Giáo Dục - Đào Tạo

(TIỂU LUẬN) lập TRÌNH NÂNG CAO (CO2039) bài tập lớn tìm hiểu về ngôn ngữ golang

39 12 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH ĐẠI HỌC BÁCH KHOA KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH LẬP TRÌNH NÂNG CAO (CO2039) Bài tập lớn Tìm hiểu ngôn ngữ Golang GVHD: Sinh viên: Trương Tuấn Anh Đặng Quang Huy - 2012504 - L05 THÀNH PHỐ HỒ CHÍ MINH, THÁNG 2022 Đại học Bách Khoa thành phố Hồ Chí Minh Khoa Khoa học Kỹ thuật Máy tính Contents Giới thiệu chung 1.1 Tổng quan 1.2 Lịch sử phát triển 1.2.1 1.2.2 Go - Một ngơn ngữ lập trình tuyệt vời 2.1 Đặc điểm 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.2 Điểm mạnh 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.3 Những mặt hạn chế 2.3.1 2.3.2 2.3.3 2.3.4 2.3.5 2.3.6 2.4 Cách sử dụng 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.4.8 2.4.9 2.4.10 2.4.11 2.4.12 2.4.13 2.4.14 2.4.15 2.4.16 Tổng kết Bài Tập lớn Lập Trình Nâng Cao - CO2039 Page 1/35 Đại học Bách Khoa thành phố Hồ Chí Minh Khoa Khoa học Kỹ thuật Máy tính 1.1 Giới thiệu chung Tổng quan Go (còn biết đến với tên gọi khác Golang Go Language) ngơn ngữ lập trình phát triển Google, Đây loại ngơn ngữ có mã nguồn mở (opensource, statically-typed compiled, ngôn ngữ lập trình rõ ràng (explicit programming language) Đây ngơn ngữ lập trình đa mơ hình (multi-paradigm) hướng đối tượng (object-oriented) Go ngôn ngữ dùng phổ biến Google với nhiều tổ chức khác với project có mã nguồn mở Go truyền cảm hứng hai loại ngơn ngữ lập trình phổ biến khác Python C Go thừa hưởng đơn giản từ Python hiệu C Hình 1: Go Language Sự thật thú vị: Golang (Một tên gọi khác Go) bắt nguồn từ tên miền trang chủ thức Go Nó thực hữu dụng việc tìm kiếm keyword "Golang" thuận tiện nhiều so với keyword "Go" sử dụng cơng cụ tìm kiếm Google (Nó giúp ta dễ việc tìm kiếm thơng tin ngơn ngữ lập trình này) 1.2 Lịch sử phát triển Trước Go đời, việc sử dụng ngôn ngữ phực tạp để giải vấn đề lớn trở nên khó khắn Như ngơn ngữ C++, để giải vấn đề ngơn ngữ ngày dài Điều vốn không hợp lý , thời gian tiêu tốn lẫn suất hoạt động Người đặt móng cho ngơn ngữ lập trình Go bao gồm: Robert Griesemer, Rob Pike, Ken Thompson - kỹ sư phần mềm đến từ Google Họ có chung mục đích: tạo ngơn ngữ lập trình dễ dàng sử dụng bao qt vấn đề trình làm việc với hệ thống phức tạp Vào năm 2007, Go thiết kế - với ứng dung việc cải thiện suất lập trình thời đại multicore, networked machines lagre corebase Từ Go, nhà thiết kế dã cố gắng Bài Tập lớn Lập Trình Nâng Cao - CO2039 Page 2/35 Đại học Bách Khoa thành phố Hồ Chí Minh Khoa Khoa học Kỹ thuật Máy tính khắc phục điểm yếu giữ nguyên tính tối ưu ngơn ngữ lập trình khác Hình 2: Từ trái sang phải: Robert Griesemer, Rob Pike, Ken Thompson Go mắt với cộng đồng vào tháng 11 năm 2009, phiên 1.0 tiếp tục giới thiệu vào tháng năm 2012 Vào tháng 11/2016, Go Go Mono fonts mắt hai nhà thiết kế: Charles Bigelow Kris Holmes, chuyên dụng cho project sử dụng ngôn ngữ Go Tháng 4/2018, Logo ngôn ngữ thay biểu tượng GO cách điệu nghiêng bên phải với đường nét cuối Hình 3: Logo ngơn ngữ lập trình Go Bài Tập lớn Lập Trình Nâng Cao - CO2039 Page 3/35 Đại học Bách Khoa thành phố Hồ Chí Minh Khoa Khoa học Kỹ thuật Máy tính 1.2.1 Generic Programming Generic programming (Lập trình tổng quát) mơt dạng lập trình máy tính mà đó, thuật toán viết theo dạng xác định sau sau khởi tạo (instantiate) cần cho kiểu cụ thể mà cung cấp tham số Sự thiếu hụt việc hộ trợ Generic programming phiên Golang dấy lên tranh luận đáng lưu ý Các nhà lập trình bày tỏ hứng thú với generic programming ghi tích hợp vào hàm (functions) với kiểu chung chung (type-generic), kiểu sử dụng trường hợp đặc biệt Pike - lập trình viên thiết kế Golang, nghĩ lúc điểm yếu cải tiến Vào tháng 4/2018, nhà phát triển Go cho mắt dự thảo thiết kể generic programming error-handling, từ thu thấp phản hồi người dùng Nhưng đề xuất error-handling bị loại bỏ Tháng 6/2020, tài liệu thiết kế dự thảo xuất nhằm bổ sung cú pháp cần thiết cho Go để khai báo hàm kiểu chung Một công cụ dịch mã, go2go cung cấp cho người dùng với mục đích thử cú pháp mới, với phiên hỗ trợ chung với Go Playground trực tuyến Với phiên 1.18 Go, Generic programming tích hợp nhằm tối ưu hóa ứng dụng cho lập trình viên Hình 4: An Example of Generic Programming in Golang Bài Tập lớn Lập Trình Nâng Cao - CO2039 Page 4/35 Đại học Bách Khoa thành phố Hồ Chí Minh Khoa Khoa học Kỹ thuật Máy tính 1.2.2 Các phiên phát hành Các phiên Go đảm bảo tính tương thích với việc đặc tả ngơn ngữ phần thư viên chuẩn Dưới bảng thống kê phiên phát hành ngôn ngữ Golang Release go1 go1.1 go1.2 go1.3 go1.4 go1.5 go1.6 go1.7 go1.8 go1.9 go1.10 go1.11 go1.12 go1.13 go1.14 go1.15 go1.16 go1.17 go1.18 Bài Tập lớn Lập Trình Nâng Cao - CO2039 Page 5/35 Đại học Bách Khoa thành phố Hồ Chí Minh Khoa Khoa học Kỹ thuật Máy tính 2.1 Go - Một ngơn ngữ lập trình tuyệt vời Đặc điểm Ngôn ngữ Go, xuât thị trường vào năm 2009, thiết kế với mục đích nhằm nâng cao sản phẩm ứng dụng thuộc ngành bao gồm: networked machines, multicore, huge codebases Một điểm tuyệt vời mà Go thể cho là: • Static typing runtime efficiency C++ • Usability Readability Python Javascript • Khái niệm Lập trình hướng đối tượng (OOP) SmallTalk • Concurrency element Newsqueak Sau sâu phân tích đặc điểm Go 2.1.1 Open-source Đặc điểm ngơn ngữ lập trình Golang ngơn ngữ lập trình có mã nguồn mỡ Nghĩa là, người tải thử nghiệm với code để mang đến source code tốt sưa lại bug liên quan Hình 5: Đắc diểm Open-source 2.1.2 Static-typing Go ngôn ngữ statically-typed làm việc với chế biên dịch code cách xác quan tâm tới kiểu chương trình mức độ tương thích Nó giúp cho lập trình viên tự việc khắc phục khó khắn so với sử dụng ngôn ngữ dynamically-typed Bài Tập lớn Lập Trình Nâng Cao - CO2039 Page 6/35 Đại học Bách Khoa thành phố Hồ Chí Minh Khoa Khoa học Kỹ thuật Máy tính 2.1.3 Concurrency Support Một đặc tính mạnh mẽ ngơn ngữ lập trình Go việc hộ đồng thời thực thi (concurrency) Golang, khơng ngơn ngữ lập trình khác, đề xuất lựa chon đồng thời dễ dàng dễ tìm kiếm Nó giúp cho lập trình viên mảng phần mềm dễ dàng việc hồn thành u cầu cách nhanh giải phóng tài nguyên đữ phân bổ dụng kết nối với sớm hơn, nhiều 2.1.4 Powerful Standard Library Tool Set Ngơn ngữ lập trình Go cho với thư viên tiêu chuẩn mạnh mẽ Những thư viện cho phép sử dụng component phong phú, giúp cho nhà phát triển tránh khỏi viêc phải sử dụng gói bên thứ Ngồi ra, đưa cho lượng lớn công cụ giúp cho việc phát triển tiến trình thêm hiểu quả, là: • Gofmt: Nó giúp tự động chỉnh sửa định dạng code ngôn ngữ Go, bới khó khắn tính readability • Gorun: Cơng cụ dùng để thêm vào "bang line" code nguồn để chạy nó, chạy dịng code sode cách rõ ràng Nó thường sử dụng bới nhà lập trình Go q trình thử nghiệm với dịng mã viết Python • Goget: Đây cơng cụ dùng để tải thư viện từ GitHub lưu trử GoPath, từ giúp cho lập trình viên để dạng inport thư viện project • Godoc: Là cơng cụ dùng để phân tích mã nguồn code ngơn ngữ Golang, bao gồm comment tạo a văn băng HTML định dạng văn Văn tạo thường gắn chặt với code văn định vị cách dễ dàng với cú click chuột 2.1.5 Testing Capabilities Ngơn ngữ Go cịn đề xuất hội để viết unit tests với việc viết app codes Bên cạnh đó, cúng giúp hổ trợ việc hiểu độ bao phủ code, kiểm tra hiệu suất, viết code mâu để sáng tạo nên tệp code riêng người 2.1.6 Garbage Collection Go cung cấp cho người sử dụng sức mạnh tuyệt vời thu gom rác (garbage collection) Nghĩa là, nhà phát triển khơng cịn phải lo lắng việc giải phóng trỏ (pointers) tình liên quan đến lung lẳng pointers (Dangling pointer trỏ mã dẫn đến khối nhớ sai số điểm đến ý muốn) 2.1.7 Kết Luận Nhờ đặc điểm nêu trên, Go đón nhận bới nhiều quan tâm nhiều tập đoàn tiềng khác Google như: Apple, Twitter, Facebook, Bài Tập lớn Lập Trình Nâng Cao - CO2039 Page 7/35 Đại học Bách Khoa thành phố Hồ Chí Minh Khoa Khoa học Kỹ thuật Máy tính Hình 6: Những tập đoàn sử dụng Go Ngoài ra, Go ngôn ngữ ứng dụng công ty nhỏ start up để tao phần mềm cần thiết Và từ thấy thành tựu tuyệt vời chúng Từ phải tìm hiều điểm mạnh điểm yêu ngôn ngữ nhằm sử dung cách tối ưu hơn, tạo tiền đề cho viêc phát triển ngôn ngữ nói riêng lập trình ứng dụng nói chung 2.2 2.2.1 Điểm mạnh Easy Learning Curve Với coder mớt bất đầu Go ngơn ngữ lập trình cho trình trải nghiệm viết code họ với ngơn ngữ (statically-typed), cịn thế, việc học thứ Go đêm điều Tất nhiên, khơng khiên trở thành người giỏi việc code, phải hiểu rõ thư viện tiêu chuẩn ngôn ngữ, luyện tập thật nhiều chuyên sâu, với mức độ thích hợp, những điều giản đơn Go học cách dễ dàng Với nhà lập trình đến từ ngơn ngữ khác Go gần với C lại có thêm điểm như: garbage collection, structual typing, CSP-style concurrency Đươc phát triển Google, Go cài đặt tiêu chuẩn định cho tài liều Với rõ ràng dễ dàng để nắm bắt Những điều Go định nghĩa cách dễ hiểu chung ta cố gắng tiếp cận Các Blog Go cung cấp cho chung nguồi tài liệu cho nhà lập trình để nâng cao trình độ người 2.2.2 Simplicty Speed Go ngôn ngữ lập trình tối giản Hầu hết, điều tốt Lõi ngôn ngữ bao gồm số tính đơn giản, trực giao, từ kết hơp theo số lượng nhỏ tương đối cách Điều khiến cho việc học ngơn ngữ, đọc viết chương trình trở nên dễ dàng Ngơn ngữ Go có khả tạo executable code, chép mà khơng phá hủy dependencies Go cung cấp số lợi ích thú vị speed Một chương trình Go biên dịch thẳng thành mã Bài Tập lớn Lập Trình Nâng Cao - CO2039 Page 8/35 Đại học Bách Khoa thành phố Hồ Chí Minh Khoa Khoa học Kỹ thuật Máy tính • Switch statement: bao gồm Expression Switch Type Switch – Expression Switch switch ( boolean - e x p r e s s i o n or integral type ) { case boolean - e x p r e s s i o n or s ta te m en t ( s ) ; case boolean - e x p r e s s i o n or s ta te m en t ( s ) ; /* you can have any number of case s t a t e m e n t s */ default : /* Optional */ s ta te m en t ( s ) ; 9} 10 Ví dụ: package main import " fmt " func main () { var grade string = "B" var marks int = 90 12 switch marks { case 90: grade = "A" case 80: grade = "B" 17 } switch { case grade == "A" : 10 11 15 16 18 19 20 21 22 23 24 fmt Printf (" Better try again \n" ) 25 27 28 29 30 31 32 26 fmt Printf (" Invalid grade \n" } fmt Printf (" Your grade is %s\n" , grade ) ; } // Result is: // E x ce ll e nt ! // Your grade is A 33 – Type Switch: switch x ( type ) { case type : s ta te m en t ( s ) ; case type : s ta te m en t ( s ) ; /* you can have any number of case s t a t e m e n t s */ default : /* Optional */ s ta te m en t ( s ) ; } 10 Bài Tập lớn Lập Trình Nâng Cao - CO2039 Page 22/35 Đại học Bách Khoa thành phố Hồ Chí Minh Khoa Khoa học Kỹ thuật Máy tính Ví dụ: package main import " fmt " 3func main () { var x in t er fa c e {} 19 20 21 22 switch i := x ( type ) { case nil : fmt Printf (" type of x :%T" ,i ) case int : fmt Printf ("x is int " ) 10 case float64 : 11 fmt Printf ("x is float64 ") 12 case func ( int ) float64 : 13 fmt Printf ("x is func ( int )" ) 14 case bool , string : 15 fmt Printf ("x is bool or string " ) 16 default : 17 fmt Printf (" don ’t know the type " ) 18 } } // Result is: // type of x : 23 2.4.10 Vòng lặp Trong Go, dùng for để tạo vịng lặp thơng qua cách sau: • Syntax1: for i n i t i a l i z a t i o n ; c on d it io n ; update { s ta te m en t ( s ) } – initialization: Khởi tạo biến đếm – condition: Điều kiện tiếp tục vòng lặp – update: Cập nhật giá trị biến đếm sau vòng lăp Ví dụ: package main import " fmt " func main () { // for loop for i := 1; fmt Println ( i ) } 10 11 } 12 Kết xuất là: Bài Tập lớn Lập Trình Nâng Cao - CO2039 Page 23/35 Đại học Bách Khoa thành phố Hồ Chí Minh Khoa Khoa học Kỹ thuật Máy tính 5 • Syntax2: for index ; value = < array >{ s ta te m en t ( s ) } Ví dụ: package main import " fmt " func main () { check := [3] string { " Huy " , " Hieu " , "Ha"} for idx , val := range check { fmt Printf ( "%v\n" , val ) } } 10 Kết xuất là: Huy Hieu Ha 2.4.11 Function Hàm khái niệm quan trong Go Chúng ta định nghĩa hàm Go sau: func f u n c t i o n _ n a m e ( [ p ar a me te r { } list ] ) [ r e t u r n _ t y p e s ] body of the function Với phân hàm sau: • Func: Khai báo hàm định nghĩa • Function Name: Tên hàm định nghĩa ( dùng để gọi hàm sử dụng) • Parameters: Các tham số truyền vào hàm • Return type: List giá trị trả thực hàm (có khơng) • Function body: Chứa statement để thực hàm định nghĩa Ví dụ 1: Không trả giá trị package main import " fmt " // SimpleFunction prints a message Bài Tập lớn Lập Trình Nâng Cao - CO2039 Page 24/35 Đại học Bách Khoa thành phố Hồ Chí Minh Khoa Khoa học Kỹ thuật Máy tính func S i m p l e F u n c t i o n () { fmt Println (" Hello World ") } 10 func 11 12 main () { S i m p l e F u n c t i o n () } Kết thu là: Hello World Ví dụ 2: Trả giá trị package main import " fmt " add ( x int , y int ) int { total := total = x + y 7return total } func 10 func 11 12 13 14 main () { // Ac c ep ti n g return value in varaible sum := add (20 , 30) fmt Println ( sum ) } Kết thu là: 50 Ví dụ 3: Trả nhiều giá trị package main import " fmt " func r ec ta n gl e ( l int , b int ) ( area int , p ar a me t er p ar am e te r = * ( l + b ) area = l * b return // Return s ta t em e nt without specify } int ) { variable name 10 11 func main () { var a , p int a , p = r ec t an g le (20 , 30) 14 fmt Println ( " Area :" , a ) 15 fmt Println ( " P ar a me t er :" , p ) } 12 13 16 Kết thu là: Area :600 P ar a me te r :100 Trong số trường hợp nhât đinh, sử dụng hàm trả nhiều giá trị, quan tâm đến giá trị sủ dụng ’_’ để loại bỏ giá trị Ví dụ: package main import " fmt " func r ec ta n gl e ( l int , b int ) ( area int , p ar a me t er Bài Tập lớn Lập Trình Nâng Cao - CO2039 int ) { Page 25/35 Đại học Bách Khoa thành phố Hồ Chí Minh Khoa Khoa học Kỹ thuật Máy tính p ar am e te r = * ( l + b ) area = l * b return // Return s ta t em e nt without } specify variable name 10 11 func main () { var a , p int _ , p = r ec t an g le (20 , 30) 14 fmt Println ( " P ar a me t er :" , p ) } 12 13 15 P ar a me te r :100 2.4.12 Array Array cấu trúc liệu bao gồm tập hợp thành phần có kiểu Để định nghĩa Array Go, ta sử dụng cú pháp var v a r i a b l e _ n a m e [ SIZE ] v a r i a b l e _ t y p e // Single Di m en t io n Array Ví dụ: package main import ( " fmt " " reflect " ) func 10 main () { var intArray [5] int var strArray [5] string 11 12 13 14 15 16 17 fmt Println ( reflect ValueOf ( intArray ) Kind () ) fmt Println ( reflect ValueOf ( strArray ) Kind () ) } \\ Result is \\ array \\ array Để gán giá trị trị truy xuất thành phần arra, ta sử dụng index number Ví dụ: package main import " fm func var Huy Huy Huy main () { Huy [0] [1] [2] = = = 10 11 12 13 fmt Println ( Huy [0]) fmt Println ( Huy [1]) fmt Println ( Huy [2]) Output là: ta la nang Ta tạo mảng Array Literal Ví dụ: Bài Tập lớn Lập Trình Nâng Cao - CO2039 Page 26/35 "ta" "la" " nang " Đại học Bách Khoa thành phố Hồ Chí Minh Khoa Khoa học Kỹ thuật Máy tính package main import " fmt " func main () { x var y := [5] int {10 , [5] int = fmt Println ( x ) fmt Println ( y ) 10 11 } Kết đước xuất hình là: [10 20 30 40 50] [10203000] Chúng ta tạo mảng dù cung cấp độ dài chún, trình biên dịch nhận diện độ dài mảng, dựa elements khai báo mảng Ví dụ: package main import ( " fmt " " reflect " ) func main () { check := [ ] int {1 , , 3} 10 11 12 13 fmt Println ( reflect ValueOf ( check ) Kind () ) fmt Println ( len ( check ) ) } Chùng ta có kết xuất hình là: array Khi khai báo mảng, giá trị khởi tạo cách chuyên dụng sau package main import " fmt " func main () { fmt Println ( x ) } Output: [0 ,10 ,0 ,30 ,0] 2.4.13 Struct x := [5] int {1: 10 , 3: 30} Một cấu trúc Struct tập hợp miền liệu khai bao Structs cách để tạo kiểu data cụ thể người dùng tự định nghĩa Go Để khai báo kiểu cấu trúc, ta sử dụng Syntax sau: i d e n t i f i e r struct { field1 d a ta _ ty pe 3field2 d a ta _ ty pe type Bài Tập lớn Lập Trình Nâng Cao - CO2039 Page 27/35 Đại học Bách Khoa thành phố Hồ Chí Minh Khoa Khoa học Kỹ thuật Máy tính field3 d a ta _ ty pe } Ví dụ: package main import " fmt " rec struct { length float64 7breadth float64 color string } type 10 11 func 12 13 14 15 16 17 18 main () { var how rec how length = 3.12 how breadth = 4.5 how color = " pink " fmt Println ( rec {10.5 , 25.10 , " red " }) fmt Println ( " check : " , how color ) } Chúng ta có kết là: {10.5 25.1 red } check : pink 2.4.14 Map Map cấu trúc dũ liệu cung cấp cho bạn tập hợp không trật tự cặp key/value Nó dùng để tìm kiếm giá trị key cung cấp Map khởi tạo Hash table, giúp tìm kiếm elements cách nhanh chóng truy xuất liệu dễ dàng Ví dụ Map Go: package main import " fmt " var employee = map [ string ] int {" Mark " : 10 , " Sandy " : 20} func main () { fmt Println ( employee ) } Kết thu là: map [ Mark :10 Sandy :20] Chúng ta khai báo Map từ khóa make biết độ dài Map dùng hàm llen() package main import " fmt " func main () { var employee = make ( map [ string ] int ) employee [ " Mark " ] employee [ " Sandy " ] Bài Tập lớn Lập Trình Nâng Cao - CO2039 Page 28/35 Đại học Bách Khoa thành phố Hồ Chí Minh Khoa Khoa học Kỹ thuật Máy tính 10 e m p l o y e e L i s t := make ( map [ string ] int ) 11 12 13 14 fmt Println ( len ( employee ) ) fmt Println ( len ( e m p l o y e e L i s t ) ) // } Chúng ta truy cập, thêm, xóa cập nhật liệu cách sử dụng index key sau: package main import " fmt " func main () { var employee = map [ string ] int {" Mark " : 10 , " Sandy " : 20} fmt Println ( employee [ " Mark " ]) // Access employee [ " Rocky " ] = 30 // Add 10 element 11 employee [ " Mark " ] = 50 // 12 Update item 13 14 delete ( employee , " Mark ") // Delete item 15 16 17 fmt Println ( employee ) ; } 2.4.15 Gouroutine Channels Như đề cập trên, Go ngôn ngữ hổ trợ đồng thời (Concurrency) giúp hàm chạy độc lập với Goroutines function để trợ giúp điều Nó sử dụng Go để xử lý phép tốn diễn đồng thời Muốn tạo goroutines mới, sử dụng từ khóa go sum () completing go sum () completing Từ khóa go giúp cho lời gọi hàm trả lập tức, hàm bắt đầu chạy goroutines tất phần cịn lại chương trình thực thi (Tất hàm main Go bắt đầu sử dụng gouroutine, nên chương trình Go chạy goroutine) Để thấy rõ ràng, có ví dụ sau cách tạo gouroutine: package main import ( " fmt " "io/ ioutil " " log " " net / http " " time " ) 10 11 12 func r e s p o n s e S i z e ( url string ) { fmt Println ( " Step1 : " , url ) Bài Tập lớn Lập Trình Nâng Cao - CO2039 Page 29/35 Đại học Bách Khoa thành phố Hồ Chí Minh Khoa Khoa học Kỹ thuật Máy tính 13 14 16 response , err := http Get ( url ) if err != nil { 15 log Fatal ( err ) } 17 18 19 fmt Println ( " Step2 : " , url ) defer response Body Close () 20 21 22 23 25 26 27 fmt Println ( " Step3 : " , url ) body , err := ioutil ReadAll ( response Body ) if err != nil { 24 log Fatal ( err ) } fmt Println ( " Step4 : " , len ( body ) ) } 28 29 30 31 32 33 34 func go go go main () { r e s p o n s e S i z e ( " https :// www g o l a n g p r o g r a m s com ") r e s p o n s e S i z e ( " https :// c od e rw a ll com ") r e s p o n s e S i z e ( " https :// s t a c k o v e r f l o w com " ) time Sleep (10 * time Second ) } Chúng ta thêm từ go vào trước lần gọi hàm responseSize, ba lần gọi hàm responseSize goroutines bắt đầu đồng thời lần gọi http.Get diễn đồng thời Chương trình khơng muốn chờ lần gọi đáp lại để gưi yêu cầu khác Kết cho thấy xuất lên hình diễn nhanh nhiều https :// www g o l a n g p r o g r a m s com https :// s t a c k o v e r f l o w com https :// c od e rw a ll com https :// s t a c k o v e r f l o w com https :// s t a c k o v e r f l o w com Step4 : 116749 Step1 : Step1 : Step1 : Step2 : Step3 : Step2 : https :// www g o l a n g p r o g r a m s com Step3 : https :// www g o l a n g p r o g r a m s com Step4 : 79551 10 11 12 Step2 : https :// c od e rw a ll com Step3 : https :// c od e rw a ll com Step4 : 203842 Chúng ta sử dụng hàm time.Sleep hàm main để tránh việc goroutine thoát trước goroutine ResponseSize hồn thành Ta thấy được, việc sử dụngGoroutine chưa đủ goroutine muốn giao tiếp với đồng trình chạy Và có Channels Đây chế giúp cho goroutine chia sẻ liệu với Khi chương trình thực thi hoạt động goroutine đồng thời, dứ liệu tài nguyên cần chia goroutine với nhau, channels làm việc kênh (đường ống) goroutines cung cấp chế giúp cho qua trình làm việc đồng hoạt động Một channels tạo nhơ hàm make(), hàm định từ chan keyword phân tử channels Syntax sử dụng là: Unbuffered buffered := Để gửi giá trị tới kênh cần sử dụng dấu ’

Ngày đăng: 11/12/2022, 04:38

Xem thêm:

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w