Go hay Golang là ngôn ngữ lập trình do Google thiết kế và phát triển từ năm 2009, ra đời với mục đích khai thác tối đa nền tảng đa lõi của bộ vi xử lý và hoạt động đa nhiệm tốt hơn. Với sức mạnh của Golang, hiện nay có khá nhiều dự án đang lựa chọn ngôn ngữ lập trình này để phát triển, và vì thế nhu cầu tuyển dụng Golang ngày càng lớn hơn. Trong bài viết này chúng ta cùng nhau tìm hiểu top 10 câu hỏi phỏng vấn Golang Developer để cùng có sự chuẩn bị tốt nhất trước cơ hội việc làm này nhé.
Câu 1: Bạn có thể nói gì về ngôn ngữ lập trình Golang
Go hay Golang là một ngôn ngữ lập trình mã nguồn mở giúp xây dựng phần mềm một cách dễ dàng, tin cậy và hiệu quả do các kỹ sư hàng đầu của Google phát triển. Golang được khởi nguồn từ năm 2007 và được chính thức công bố dưới dạng mã nguồn mở năm 2009. Phiên bản ổn định 1.0 được Google giới thiệu vào tháng 3/2012. Năm 2018, Google có thông báo về Golang 2 với sự chung tay phát triển của cộng đồng, mặc dù vậy đến hiện nay thì Golang 2 vẫn chưa có kế hoạch về ngày ra mắt.
Sứ mệnh của Golang là giúp tăng năng suất phần mềm, đặc biệt là ở lĩnh vực multicore processing (xử lý đa nhân), network (mạng) và những dự án có source code rất lớn.
Câu 2: Nêu những đặc tính của Golang
Golang là một ngôn ngữ kiểu tĩnh (static typed) tức là mọi thứ trong nó đều phải được khai báo kiểu. Ban đầu ngôn ngữ này sử dụng trình biên dịch thông qua ngôn ngữ C, từ phiên bản 1.5 thì tác giả đã tự viết luôn một trình compiler dành riêng cho ngôn ngữ. Ưu điểm của trình compiler này là thời gian build rất nhanh so với các trình biên dịch của các ngôn ngữ kiểu tĩnh khác.
Golang hỗ trợ kiến trúc 64 bits, nó cũng có một trình thu dọn rác tự động (Garbage Collector), ngoài ra nó còn hỗ trợ cả Web Assembly. Golang hỗ trợ lập trình đồng thời (concurrent) với từ khóa go đặt ngay trước nơi gọi hàm, kỹ thuật này gọi là Goroutine.
Với những đặc tính trên, Go là một ngôn ngữ phù hợp với việc phát triển các dự án về system như Network, Proxy, Distributed Computing, Cloud Native,…
Câu 3: Những kiểu dữ liệu trong Golang
Trong Go, có 3 loại dữ liệu cơ bản bao gồm:
- Kiểu bool (true/false)
- Kiểu dữ liệu số: int, float, byte, complex, ..
- Kiểu chuỗi (string)
Kiểu dữ liệu dẫn xuất (derived types) xây dựng từ những kiểu dữ liệu cơ bản và tích hợp sẵn trong Golang bao gồm Pointer (con trỏ), Array (mảng), Structure, Union, Function (hàm), Slice, Interface, Map và Channel.
Câu 4: Methods trong Golang khác gì với function
Golang không phải là một ngôn ngữ lập trình hướng đối tượng nên nó không hỗ trợ các lớp (class), mặc dù vậy chúng ta có thể sử dụng struct trong Golang nhằm thay thế cho class. Để có được hành vi tương tự như các lớp (class) trong các ngôn ngữ lập trình khác, Golang hỗ trợ các methods (phương thức) – nó là một hàm(function) được khai báo cho riêng một kiểu dữ liệu đặc biệt được gọi là receiver. Cú pháp để tạo một Method như sau: “func (t Type) methodName(parameter list)”.
Điểm khác cơ bản của methods so với function là việc khai báo receiver, từ đó cho phép khai báo trùng tên và chỉ cần khác kiểu dữ liệu nhận (receiver).
Câu 5: Interface trong Golang là gì?
Interface trong OOP giúp chúng ta xác định các hành vi sẽ có của một đối tượng (chưa cần khai báo nội dung bên trong). Interface trong Golang cũng là tập hợp những khai báo phương thức mà cho phép chúng ta có thể định nghĩa hoạt động cho nó được. Khi một kiểu dữ liệu định nghĩa tất cả các phương thức trong một interface thì nó được gọi là implement của interface đó. Hay nói cách khác thì trong Golang, Interface được implement một cách ngầm định (implicitly) mà không cần khai báo tường minh bằng từ khóa nào.
Một tính năng thú vị khác của interface là dùng để khai báo kiểu dữ liệu any (đại diện cho bất kỳ kiểu dữ liệu nào). Cú pháp interface{} gọi là Empty Interface giúp bạn không cần xác định rõ kiểu dữ liệu của biến, rất hay được sử dụng khi làm value cho kiểu dữ liệu map trong Golang.
Câu 6: Phân biệt Array, Slice và Map trong Golang
Array hay mảng là một tập hợp các phần tử có cùng kiểu dữ liệu nằm liên tiếp nhau, hay nói cách khác thì Array là một tập hợp có thứ tự, vì thế chúng ta có thể truy cập Array bằng chỉ số (index) của phần tử đó trong mảng.
Slice về bản chất là các tham chiếu đến mảng hiện có, nó mô tả một phần hoặc toàn bộ Array, vì thế nó có kích thước động (thay đổi được). Thông thường Slice sẽ được tạo từ 1 Array bằng cách lấy từ vị trí phần tử bắt đầu và kết thúc trên Array đó.
Map cũng là một kiểu dữ liệu tập hợp, tuy nhiên các phần tử trong nó không có thứ tự, tức là chúng ta không thể truy xuất đến phần tử trong Map bằng chỉ số như Slice hay Array. Map sẽ chứa các phần tử dạng key-value, từ đó việc truy xuất sẽ thực hiện qua các key.
Câu 7: Giải thích về Concurrency trong Golang
Concurrency là tính năng xử lý song song nhiều tác vụ cùng một lúc, giúp tận dụng năng lực xử lý của CPU. Trong Golang, một luồng được quản lý bởi Go runtime gọi là Goroutine, cú pháp khai báo của Goroutine đơn giản chỉ cần thêm từ khóa “go” vào trước mỗi hàm cần gọi.
Các Goroutine có khả năng chạy song song cùng lúc, ngoài ra chúng có thể trao đổi dữ liệu với nhau trong qua Channel (kênh). Việc sử dụng Channel cho phép đồng bộ hóa dữ liệu giữa các Goroutine; khi một Goroutine truyền dữ liệu vào Channel thì nó sẽ dừng lại để đợi một Goroutine khác lấy dữ liệu ra thì mới tiếp tục thực hiện tiếp.
Câu 8: Phương pháp xử lý lỗi trong Golang
Xử lý lỗi (error handling) trong Golang không giống với xử lý try/catch như các ngôn ngữ khác; lỗi trong Go sẽ được trả về như 1 giá trị của hàm nếu có điều gì không mong đợi (errors hoặc exceptions) xảy ra.
Kiểu error trong Go có một phương thức Error() trả về thông báo lỗi dưới dạng string. Go cũng cung cấp cho chúng ta một package error tích hợp sẵn và public với hàm gọi New. Để đưa ra những Exception thì Go cung cấp cho chúng ta cơ chế Panic. Khi một hàm gặp Panic, nó lập tức dừng xử lý, chấm dứt chương trình và giải phóng stack gọi; thông báo lỗi sẽ được trả về khi chương trình kết thúc.
Câu 9: Kể tên một số thư viện, framework phổ biến của Golang
- Beego: web framework với các module chứa các tính năng phổ biến cho ứng dụng web, nó cũng bao gồm 1 ORM (object relationship map) để truy cập dữ liệu và thư viện cho các operation với những đối tượng HTTP
- Iris: cũng là một web framework, ưu điểm của Iris là khả năng xây dựng các ứng dụng web và API hiệu suất cao
- Viper: thư viện giúp viết và đọc các nội dung liên quan tới thông số cấu hình trong Golang, hỗ trợ các định dạng như TOML, JSON, YAML,…
- Cobra: một thư viện giúp bạn xây dựng một CLI (command line interface: giao diện dòng lệnh) trong Golang
- Colly: công cụ thu thập dữ liệu tùy chỉnh từ các trang web của Golang
Câu 10: Kể tên những dự án nổi tiếng viết bằng Go
- Docker: nền tảng cung cấp cách dựng, kiểm thử và triển khai ứng dụng nhanh chóng thông qua các container
- Kubernetes: một hệ thống mã nguồn mở giúp việc triển khai, nhân rộng dễ dàng và tự động thông qua việc sử dụng các container Docker
- NATS: một Message System, là thành phần quan trọng trong các hệ thống pub/sub, event-driven
- Consul: một service dành cho việc thiết lập mạng (network) trong microservices một cách dễ dàng
Kết bài
Như vậy chúng ta đã đi qua được top 10 câu hỏi phỏng vấn thường gặp nhất cho vị trí Golang Developer. Hy vọng bài viết này mang lại thêm sự tự tin cho bạn để chinh phục được nhà tuyển dụng. Hẹn gặp lại các bạn trong bài viết tiếp theo của mình.
Bài viết đăng trên blog TopDev: https://topdev.vn/blog/top-10-cau-hoi-phong-van-golang-developer-thuong-gap/