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

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

36 9 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 Generic Programming 1.2.2 Các phiên phát 2 Go - Một ngôn ngữ lập trình tuyệt vời 2.1 Đặc điểm 2.1.1 Open-source 2.1.2 Static-typing 2.1.3 Concurrency Support 2.1.4 Powerful Standard Library Tool Set 2.1.5 Testing Capabilities 2.1.6 Garbage Collection 2.1.7 Kết Luận 2.2 Điểm mạnh 2.2.1 Easy Learning Curve 2.2.2 Simplicty Speed 2.2.3 Package System 2.2.4 Multithreading Concurrency 2.2.5 Inbuilt Testing Profiling Framework 2.3 Những mặt hạn chế 2.3.1 Quá Đơn giản 2.3.2 Không hổ trợ Máy Ảo (Virtual Machine) 2.3.3 Errol Handeling trở nên tốt 2.3.4 Những lỗi tồn động với IOS Development 2.3.5 Những vấn đề Runtime Safety 2.3.6 Một ngơn ngữ cịn non trẻ 2.4 Cách sử dụng 2.4.1 Download Golang 2.4.2 Hello World! 2.4.3 Cấu trúc chương trình 2.4.4 Syntax 2.4.5 Các kiểu Data 2.4.6 Variables 2.4.7 Constants 2.4.8 Operator 2.4.9 Decision making Go 2.4.10 Vòng lặp 2.4.11 Function 2.4.12 Array 2.4.13 Struct 2.4.14 Map 2.4.15 Gouroutine Channels 2.4.16 Xuất Output hình 6 6 7 7 8 9 10 10 10 10 10 10 11 11 11 12 13 13 14 15 16 17 19 23 24 26 27 28 29 32 Tổng kết Bài Tập lớn Lập Trình Nâng Cao - CO2039 hành 34 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ở (open-source, 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 (objectoriented) 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 đề q 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 qt) mơt dạng lập trình máy tính mà đó, thuật tố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 Status End-of-life End-of-life End-of-life End-of-life End-of-life End-of-life End-of-life End-of-life End-of-life End-of-life End-of-life End-of-life End-of-life End-of-life End-of-life End-of-life End-of-life Maintenance Current Bài Tập lớn Lập Trình Nâng Cao - CO2039 Release Date 2012-03-28 2013-05-13 2013-12-01 2014-06-18 2014-12-10 2015-08-19 2016-02-17 2016-08-15 2017-02-16 2017-08-24 2018-02-16 2018-08-24 2019-02-25 2019-09-03 2020-02-25 2020-08-11 2021-02-16 2021-08-16 2022-03-15 Maintenance end 2013-12-01 2014-06-18 2014-12-10 2015-08-19 2016-02-17 2016-08-15 2017-02-16 2017-08-24 2018-02-16 2018-08-24 2019-02-25 2019-09-03 2020-02-25 2020-08-11 2021-02-16 2021-08-16 2022-03-15 Q3 2022 Q1 2023 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 Go - Một ngơn ngữ lập trình tuyệt vời 2.1 Đặ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 hoàn thành yê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 Ngồ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 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 máy, nên đương diên hoạt động tốt so với ngôn ngữ thông dịch (interpreted) có thời gian chạy ảo (virtual runtime) Khơng kết biên dịch chương trình thực nhanh, mà tệp nhị phân biên dich có dung lượng nhỏ đến mức kinh ngạc Chúng ta đề cập đến cách mà Go xử lý tệp code ngơn ngữ Nhưng có bược tiến xa việc khiến cho chương trình ngơn ngữ Go trở nên tối ưu Godoc công cụ phân tích mã tĩnh giúp nhà lập trình viên tạo những tệp code đẹp mắt mà không sử dụng thêm ngơn ngữ ngồi khác, Javadoc, PHPDoc Nó sử dung nhiều thơng tin từ tệp code, từ phác thảo, cấu trúc tái định dạng lại Nó cập nhật với tính nâng cao bao gồm tham chiếu chéo, mãu code liên kết trực tiếp đến kho lưu trữ hệ thống kiểm soát phiên lúc trước 2.2.3 Package System Với bắt đầu làm quen với ngôn ngữ lập trinh Go, packages quen thuộc với nhà lập trình viên họ có kinh nghiệm tiếp xúc với ngôn ngữ Java C/C++ Với người khác, theo thuật ngữ bản, packages thực mục bên chương trình mà để lưu trử source codes, dependencies nhiều packages Những packages đưa đoạn code rời rạc rõ ràng tăng hiểu quản lý cho thành phần phụ thuộc (dependencies Cơ chế packages tính thiết kể đơn giản hiệu tích hợp ngơn ngữ này, chắn lợi ich tuyệt vời sử dụng ngôn ngữ Go 2.2.4 Multithreading Concurrency Những ngơn ngữ lập trình phải đối mặt với vấn đề phân bổ tài nguyên ngày khó khắn phần cứng dần trở nên phức tạp Thường lệ, nhà chế tạo thêm vào nhiều lõi (cores) vào hệ thống nhằm nâng cao hiệu Với core thêm vào, hệ thống lại cần phải trì nhiều kết nối liệu với thông qua microservices, quản lý gia tăng số lượng hàng đợi (queues) and trì caches Các phần cứng cần lập trình ngơn ngữ có hổ trợ đồng thời concurrency, có khả hỗ trợ cho hệ thông đa lõi (multi-core systems) tương lai Go hưởng lợi từ việc phát triển thời kỳ mà hệ thống đa lõi ngày trở nên phổ biến có sẵn rộng rãi phần cứng phức tạp Vì tế, nhà lập trình đặc biệt ý vào việc hỗ trợ đồng thời, phát triển ’goroutines’ thay luồng - cho phép ngôn ngữ xử lý đồng thời số lượng lớn tác vụ thời điểm model gọi CSP (Communicating Sequential Processes) Thay khóa biến để chia sẻ nhớ, Go cho phép bạn truyền giá trị lưu trữ biến bạn từ luồng sang luồng khác 2.2.5 Inbuilt Testing Profiling Framework Với lập trình viên sử dụng ngơn ngữ Javascript, việc cố gằng tìm kiếm testing framework cho project thật điều khó khăn Với Go, ngơn ngữ kèm theo công cụ kiêm Bài Tập lớn Lập Trình Nâng Cao - CO2039 Page 9/35 Đại học Bách Khoa thành phố Hồ Chí Minh Khoa Khoa học Kỹ thuật Máy tính // then display the following fmt Printf ( " Value of v1 is 400 and v2 is 700\ n " ) ; 18 19 } 20 } 21 22 23 24 25 } // Result is // Value of v1 is 400 and v2 is 700 26 • If else if statement if condition_1 { // this block will execute // when condition_1 is true } else if condition_2 { // this block will execute // when condition2 is true 10 11 } else { // this block will execute when none // of the condition is true 12 13 14 } 15 Ví dụ: package main import " fmt " func main () { // taking a local variable var v1 int = 700 10 // checking the condition if v1 == 100 { 11 12 13 14 // if condition is true then // display the following */ fmt Printf ( " Value of v1 is 100\ n " ) 15 16 17 } else if v1 == 200 { fmt Printf ( " Value of a is 20\ n " ) 18 19 } else if v1 == 300 { 20 21 fmt Printf ( " Value of a is 300\ n " ) 22 23 } else { 24 25 26 27 28 29 30 // if none of the conditions is true fmt Printf ( " None of the values is matching \ n " ) } } // Result is : // None of the values is matching 31 Bài Tập lớn Lập Trình Nâng Cao - CO2039 Page 21/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 - expression or integral type ) { case boolean - expression or integral type : statement ( s ) ; case boolean - expression or integral type : statement ( s ) ; /* you can have any number of case statements */ default : /* Optional */ statement ( s ) ; } 10 Ví dụ: package main import " fmt " func main () { /* local variable definition */ var grade string = " B " var marks int = 90 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 switch marks { case 90: grade = " A " case 80: grade = " B " case 50 ,60 ,70 : grade = " C " default : grade = " D " } switch { case grade == " A " : fmt Printf ( " Excellent !\ n " ) case grade == " B " , grade == " C " : fmt Printf ( " Well done \ n " ) case grade == " D " : fmt Printf ( " You passed \ n " ) case grade == " F " : fmt Printf ( " Better try again \ n " ) default : fmt Printf ( " Invalid grade \ n " ) ; } fmt Printf ( " Your grade is % s \ n " , grade ) ; } // Result is : // Excellent ! // Your grade is A 33 – Type Switch: switch x ( type ) { case type : statement ( s ) ; case type : statement ( s ) ; /* you can have any number of case statements */ default : /* Optional */ statement ( 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 " func main () { var x interface {} switch i := x ( type ) { case nil : fmt Printf ( " type of x :% T " ,i ) case int : fmt Printf ( " x is int " ) case float64 : fmt Printf ( " x is float64 " ) case func ( int ) float64 : fmt Printf ( " x is func ( int ) " ) case bool , string : fmt Printf ( " x is bool or string " ) default : fmt Printf ( " don ’t know the type " ) } 10 11 12 13 14 15 16 17 18 19 } // Result is : // type of x : < nil > 20 21 22 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 initia lizati on ; condition ; update { statement ( 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 terminates when i becomes for i := 1; i { statement ( 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 function_name ( [ parameter list ] ) [ return_types ] { 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 " // Sim pleFun ction 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 impleF unctio n () { fmt Println (" Hello World ") } 10 11 12 func main () { Simp leFunc tion () } Kết thu là: Hello World Ví dụ 2: Trả giá trị package main import " fmt " func add ( x int , y int ) int { total := total = x + y return total } 10 11 12 13 14 func main () { // Accepting 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 rectangle ( l int , b int ) ( area int , parameter int ) { parameter = * ( l + b ) area = l * b return // Return statement without specify variable name } 10 11 12 13 14 15 16 func main () { var a , p int a , p = rectangle (20 , 30) fmt Println ( " Area : " , a ) fmt Println ( " Parameter : " , p ) } Kết thu là: Area :600 Parameter :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 rectangle ( l int , b int ) ( area int , parameter int ) { Bài Tập lớn Lập Trình Nâng Cao - CO2039 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 parameter = * ( l + b ) area = l * b return // Return statement without specify variable name } 10 11 12 13 14 15 func main () { var a , p int _ , p = rectangle (20 , 30) fmt Println ( " Parameter : " , p ) } Parameter :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 variable_name [ SIZE ] variable_type // Single Dimention Array Ví dụ: package main import ( " fmt " " reflect " ) 10 func 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 " fmt " func main () { var Huy [3] string Huy [0] = " ta " // Assign a value to the first element Huy [1] = " la " // Assign a value to the second element Huy [2] = " nang " // Assign a value to the third element 10 11 12 13 fmt Println ( Huy [0]) // Access the first element value fmt Println ( Huy [1]) // Access the second element value fmt Println ( Huy [2]) // Access the third element value 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 Đạ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 := [5] int {10 , 20 , 30 , 40 , 50} // Intialized with values var y [5] int = [5] int {10 , 20 , 30} // Partial assignment fmt Println ( x ) fmt Println ( y ) 10 11 } Kết đước xuất hình là: [10 20 30 40 50] [10 20 30 0] Chúng ta tạo mảng dù khơng biết 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 fmt Println ( reflect ValueOf ( check ) Kind () ) fmt Println ( len ( check ) ) 11 12 13 } 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 () { x := [5] int {1: 10 , 3: 30} fmt Println ( x ) } Output: [0 ,10 ,0 ,30 ,0] 2.4.13 Struct 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: type identifier struct { field1 data_type field2 data_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 data_type } Ví dụ: package main import " fmt " type rec struct { length float64 breadth float64 color string } 10 11 12 13 14 15 16 17 18 func 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 " ] = 10 employee [ " Sandy " ] = 20 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 employeeList := make ( map [ string ] int ) 10 11 fmt Println ( len ( employee ) ) // fmt Println ( len ( employeeList ) ) // 12 13 14 } 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 element 10 11 employee [ " Mark " ] = 50 // Update item 12 13 delete ( employee , " Mark " ) // Delete item 14 15 fmt Println ( employee ) ; 16 17 } 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 () // A completing go sum () // A completing normal function call that executes sum synchronously and waits for it goroutine that executes sum asyn chrono usly and doesn ’t wait for it 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 responseSize ( 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 response , err := http Get ( url ) if err != nil { log Fatal ( err ) } 13 14 15 16 17 fmt Println ( " Step2 : " , url ) defer response Body Close () 18 19 20 fmt Println ( " Step3 : " , url ) body , err := ioutil ReadAll ( response Body ) if err != nil { log Fatal ( err ) } fmt Println ( " Step4 : " , len ( body ) ) 21 22 23 24 25 26 27 } 28 29 30 31 32 33 34 func main () { go responseSize ( " https :// www golang progra ms com " ) go responseSize ( " https :// coderwall com " ) go responseSize ( " https :// stackoverflow 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 10 11 12 Step1 : Step1 : Step1 : Step2 : Step3 : Step4 : Step2 : Step3 : Step4 : Step2 : Step3 : Step4 : https :// www golan gprogr ams com https :// stackoverflow com https :// coderwall com https :// stackoverflow com https :// stackoverflow com 116749 https :// www golan gprogr ams com https :// www golan gprogr ams com 79551 https :// coderwall com https :// coderwall com 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 := make ( chan int ) // Unbuffered channel of integer type buffered := make ( chan int , 10) // Buffered channel of integer type Để gửi giá trị tới kênh cần sử dụng dấu ’

Ngày đăng: 17/10/2022, 04:48

Xem thêm:

HÌNH ẢNH LIÊN QUAN

Hình 1: Go Language - LẬP TRÌNH NÂNG CAO (CO2039) bài tập lớn tìm hiểu về ngôn ngữ golang
Hình 1 Go Language (Trang 3)
Hình 3: Logo của ngơn ngữ lập trình Go - LẬP TRÌNH NÂNG CAO (CO2039) bài tập lớn tìm hiểu về ngôn ngữ golang
Hình 3 Logo của ngơn ngữ lập trình Go (Trang 4)
Hình 2: Từ trái sang phải: Robert Griesemer, Rob Pike, và Ken Thompson - LẬP TRÌNH NÂNG CAO (CO2039) bài tập lớn tìm hiểu về ngôn ngữ golang
Hình 2 Từ trái sang phải: Robert Griesemer, Rob Pike, và Ken Thompson (Trang 4)
Dưới đây là bảng thống kê các phiên bản đã được phát hành của ngôn ngữ Golang. ReleaseStatusRelease DateMaintenance end - LẬP TRÌNH NÂNG CAO (CO2039) bài tập lớn tìm hiểu về ngôn ngữ golang
i đây là bảng thống kê các phiên bản đã được phát hành của ngôn ngữ Golang. ReleaseStatusRelease DateMaintenance end (Trang 6)
Hình 5: Đắc diểm Open-source - LẬP TRÌNH NÂNG CAO (CO2039) bài tập lớn tìm hiểu về ngôn ngữ golang
Hình 5 Đắc diểm Open-source (Trang 7)
Hình 6: Những tập đồn đã và đang sử dụngGo - LẬP TRÌNH NÂNG CAO (CO2039) bài tập lớn tìm hiểu về ngôn ngữ golang
Hình 6 Những tập đồn đã và đang sử dụngGo (Trang 9)
Hình 7: Trang chủ chính thức của Go - LẬP TRÌNH NÂNG CAO (CO2039) bài tập lớn tìm hiểu về ngôn ngữ golang
Hình 7 Trang chủ chính thức của Go (Trang 12)
Đầu tiên, vào trang chủ chính của của ngôn ngữ Go go.dev. Chúng ta sẽ được màn hình hiển thị - LẬP TRÌNH NÂNG CAO (CO2039) bài tập lớn tìm hiểu về ngôn ngữ golang
u tiên, vào trang chủ chính của của ngôn ngữ Go go.dev. Chúng ta sẽ được màn hình hiển thị (Trang 12)
Hình 9: Trang hướng dẫn Download Golang - LẬP TRÌNH NÂNG CAO (CO2039) bài tập lớn tìm hiểu về ngôn ngữ golang
Hình 9 Trang hướng dẫn Download Golang (Trang 13)
Hình 10: Một số Keywword trong Go - LẬP TRÌNH NÂNG CAO (CO2039) bài tập lớn tìm hiểu về ngôn ngữ golang
Hình 10 Một số Keywword trong Go (Trang 15)
Hình 11: Các tốn tử số học - LẬP TRÌNH NÂNG CAO (CO2039) bài tập lớn tìm hiểu về ngôn ngữ golang
Hình 11 Các tốn tử số học (Trang 18)
Hình 12: Các tốn tử so sánh - LẬP TRÌNH NÂNG CAO (CO2039) bài tập lớn tìm hiểu về ngôn ngữ golang
Hình 12 Các tốn tử so sánh (Trang 18)
Hình 14: Các tốn tử cho Bit - LẬP TRÌNH NÂNG CAO (CO2039) bài tập lớn tìm hiểu về ngôn ngữ golang
Hình 14 Các tốn tử cho Bit (Trang 19)
Hình 13: Các tốn tử logic - LẬP TRÌNH NÂNG CAO (CO2039) bài tập lớn tìm hiểu về ngôn ngữ golang
Hình 13 Các tốn tử logic (Trang 19)
1 if conditi on { - LẬP TRÌNH NÂNG CAO (CO2039) bài tập lớn tìm hiểu về ngôn ngữ golang
1 if conditi on { (Trang 20)
Hình 16: Các tốn tử hổn hợp - LẬP TRÌNH NÂNG CAO (CO2039) bài tập lớn tìm hiểu về ngôn ngữ golang
Hình 16 Các tốn tử hổn hợp (Trang 20)
Kết quả đước xuất ra màn hình là: 1 [10 20 30 40 50] - LẬP TRÌNH NÂNG CAO (CO2039) bài tập lớn tìm hiểu về ngôn ngữ golang
t quả đước xuất ra màn hình là: 1 [10 20 30 40 50] (Trang 28)
2.4.16 Xuất Output ra màn hình - LẬP TRÌNH NÂNG CAO (CO2039) bài tập lớn tìm hiểu về ngôn ngữ golang
2.4.16 Xuất Output ra màn hình (Trang 33)
48 sleep := ran d. Int63n (50) - LẬP TRÌNH NÂNG CAO (CO2039) bài tập lớn tìm hiểu về ngôn ngữ golang
48 sleep := ran d. Int63n (50) (Trang 33)
w