Tự học Go trong... vài ngày - Tập 1
Go
39
White

Huy Trần viết ngày 09/07/2015

Go là gì? Dùng nó cho việc gì?

Chắc hẳn đến thời điểm hiện tại, không ai là chưa nghe đến Go (hay còn gọi là Golang), một ngôn ngữ lập trình được phát triển nội bộ bởi Google vào năm 2007, và sau đó được công bố vào năm 2009.

Theo như Google, ngôn ngữ này được phát triển để giải quyết các vấn đề của Google (chúng ta sẽ nói về cái này sau).

Ấn tượng đầu tiên của mình khi tiếp cận với Golang đó là:

  • Xấu kinh dị: ai đời cái ngôn ngữ gì mà vừa xấu lại vừa rắc rối, lai căng Ruby, Python, Javascript, C-like loạn xà ngầu. Nhưng nào ngờ càng học càng thấy mê.
  • Lại một ngôn ngữ mới nữa à...
  • Làm gì với nó đây? cảm giác của mình lúc đó giống như khi học Pascal, ngoài việc đem ra để giải các bài tập thuật toán ở trường ra, chả dùng nó được vào việc gì.

Tất nhiên cái ấn tượng ban đầu thì bao giờ cũng không tốt đẹp mấy, cho đến lúc cuộc đời xô đẩy và buộc mình phải tìm đến Go.

Warning: Đoạn sau mang tính chất PR trá hình, có thể bỏ qua =))

Chả là mình có làm một cái server game online, clone lại trò agar.io nổi tiếng, server này mình viết bằng nodejs (ở đây nè), cũng lôi kéo được một vài bạn lập trình viên khắp nơi đổ về đâm chém, gạch đá mình vì architect ngu, performance kém, lag, giật, tiêu tốn tài nguyên,... và sau khi mình ăn no gạch rồi thì các bạn ấy ngồi lại giúp mình hoàn thiện nó (yêu thế cơ chứ!)

Nhưng suy cho cùng, Javascript thì vẫn là Javascript, nó không phải là sự lựa chọn tối ưu cho những ứng dụng có lượng người truy cập và request liên tục như game online (server agar.io gốc cũng viết bằng C++ không phải JS). Tư tưởng "Javascript for everything" lệch lạc sụp đổ ngay tại đây. Những nhược điểm của Javascript trở thành rào cản lớn cho việc phát triển game online: Cấp phát và quản lý bộ nhớ kém, callback hell, single threaded, scaling tốn kém,...

Đây cũng là lúc mà mình nghĩ tới chuyện tìm một ngôn ngữ khác để thiết kế lại toàn bộ phần server (tất nhiên là cả architect của server, phương thức gửi nhận gói tin,...)

Và lúc này xuất hiện rất nhiều ứng viên để mình lựa chọn:

  • Java: Đây là ngôn ngữ được recommend nhiều nhất khi nói về chuyện làm server, nhưng thực sự mình ghét việc ngồi config rồi deploy với Java. Mình muốn tìm một cái gì đó linh hoạt, đa năng nhưng phải gọn nhẹ.

  • C# có lẽ là sự lựa chọn tối ưu nhất: cú pháp đẹp, quản lý bộ nhớ tốt, có garbage collector nên khỏi lo memory leaks, đi kèm là một lực lượng đông đảo các thư viện hỗ trợ gần như cho mọi thứ, nhưng có một nhược điểm là C# cần có Windows để chạy. Mà mình thì ghét dùng server Windows, thôi next.

  • C++: đây có thể coi là "mối tình đầu" của mình. Bắt đầu học lập trình với C++, tham gia vài dự án game trên mạng cũng dùng, và sau này thực tập ở Gameloft cũng làm game bằng C++ nốt, rất mạnh, nhưng không hề zui tí nào, rất ít thư viện hỗ trợ lập trình mạng, phải tự quản lý bộ nhớ một cách thủ công nên memory leaks là một cơn ác mộng...

Đến đây, danh sách ứng viên chỉ còn lại mỗi anh chàng Golang. Có thể xem là anh em với C/C++ với cú pháp hiện đại, siêu gọn nhẹ, thời gian compile cực kì nhanh, cross-platform, tích hợp sẵn nhiều thư viện built-in trong đó có cả các thư viện để lập trình mạng, goroutine, quản lý bộ nhớ tốt, có garbage collector,... nói chung là nó có hết mọi thứ mình đang tìm kiếm. Đích thị đây là sự lựa chọn của mình rồi.

Tóm lại, Golang là một ứng viên xuất sắc cho việc xây dựng và phát triển các ứng dụng Server-side, có thể handle một lượng lớn kết nối/request, đúng như những vấn đề mà Google đang giải quyết.

Tuy nhiên, ngoài việc ứng dụng vào server side, gần như mình chưa thấy tiềm năng ứng dụng của Go vào một lĩnh vực nào khác cả...

Dông dài đủ rồi, bây giờ chúng ta sẽ tiến hành bước đầu tiên, đó là cài đặt môi trường.

Cài đặt môi trường phát triển Go

Mình khuyến khích các bạn sử dụng môi trường Unix như Linux hay Mac OS X cho việc dev. Mình không ghét Windows nhưng mà cài đặt môi trường dev trên win rất tốn thời gian và phiền phức (các bạn đã từng cài đặt môi trường Python hay Ruby chắc sẽ đồng ý).

Nếu không có điều kiện sử dụng các môi trường Unix, các bạn có thể dùng Docker hoặc Vagrant, sẽ tiện hơn là cài trực tiếp trên môi trường Windows.

Bước 1: Cài đặt Go runtime

Windows

Đối với các bạn dùng Windows, cài bằng bộ cài MSI sẽ tiện hơn, nó sẽ tự động config hết mọi thứ cần thiết.

Đầu tiên, tải bộ cài tại đây https://golang.org/dl và chạy file go<version>.windows-386.msi (32 bit) hoặc go<version>.windows-amd64.msi (64 bit), tuỳ vào hệ điều hành bạn đang sử dụng.

Linux và Mac OS X

Với các bạn xài môi trường Unix, chúng ta nên cài bằng dòng lệnh.

Chúng ta sẽ cài Go thông qua Homebrew (có thể bỏ qua nếu bạn đã cài trước rồi), khởi động Terminal lên và gõ:

(Đã update link mới. Thank bác @TrungTran)

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Sau khi cài xong Homebrew, chúng ta bắt đầu cài Go với lệnh:

$ brew install go --cross-compile-common

Ngồi rung đùi vài phút (hoặc vài giây, hoặc vài tiếng, tuỳ vô đường truyền nhà bạn).

Mac OS X Installer

Trên Mac, nếu bạn không thích cài bằng dòng lệnh, có thể tải bộ cài từ trang chủ https://golang.org/dl/ và cài trực tiếp.

Go runtime sẽ được cài vào thư mục /usr/local/go và chúng ta cần setup biến môi trường (PATH) ở bước tiếp theo.

Bước 2: Cài đặt biến môi trường

Windows

Trên Windows, chúng ta sẽ cài đặt biến môi trường bằng cách click phải vào My Computer chọn Properties, chọn tab Advanced và click nút Environment Variables.

Nếu bạn cài đặt Go vào thư mục mặc định là C:\Go thì bạn cần cấu hình như sau:

  • Tạo một biến mới tên là GOROOT với giá trị là C:\Go
  • Chọn biến PATH có sẵn, thêm vào sau dấu chấm phẩy ; cuối dòng đường dẫn sau: C:\Go\bin;

Linux và Mac OS X

Trên các máy Unix, bạn cài đặt biến môi trường bằng cách chỉnh sửa file $HOME/.profile hoặc $HOME/.bash_profile.

Nếu không tìm thấy biến $HOME, có thể thay nó bằng /user/local

Hãy thêm nội dung sau:

export GOROOT=$HOME/go
export PATH=$PATH:$GOROOT/bin

Thế là xong rồi đấy! Đơn giản, phải không nào?

Bước 3: Chạy thử

Bây giờ, chúng ta có thể kiểm tra xem Go đã được cài hoàn chỉnh hay chưa, bằng cách gõ lệnh sau vào Terminal (hoặc Command Line trên Windows):

$ go version

Nếu Go được cài đặt đầy đủ thì nội dung output sẽ giống thế này:

go version go1.4.2 darwin/amd64

Viết chương trình đầu tiên bằng Go

OK, cài đặt xong rồi thì bắt tay vào code thôi. Chương trình đầu tiên, đoán ra rồi phải không? là chương trình huyền thoại mà bài nào cũng viết: Hello World =))

Chúng ta sẽ tạo một file mới, tên là hello.go và gõ đoạn chương trình sau vào. Nhưng hãy nhớ là: Gõ vào, đừng copy paste!. Phải tự gõ vào mới nhớ được!

package main

import "fmt"

func main() {
    fmt.Printf("Hello Gopher's World!")
}

Gõ xong rồi. Bạn có thấy code nó quái thế nào không?

Không có chấm phẩy cuối dòng, từ khoá func cứ như là Swift vậy, hao hao giống Javascript nữa. Còn cái gì nữa đây? fmt.Printf để in nội dung ra màn hình, có cần phải dài dòng vậy không?

Golang là thế đấy, nếu bạn không thích nó, thì phải tập thích nó đi thôi =))

Bây giờ hãy compile và chạy chương trình với lệnh:

$ go run hello.go

Output sẽ là:

Hello Gopher's World!

Xong rồi đó, chúc mừng, bạn đã viết được chương trình đầu tiên của mình bằng Go rồi đấy =))

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

Huy Trần

115 bài viết.
1763 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
167 46
Tại sao phải viết blog kĩ thuật? Có rất nhiều bài viết trên mạng nói về vấn đề tại sao một lập trình viên nên thường xuyên viết các bài blog kĩ thu...
Huy Trần viết hơn 3 năm trước
167 46
White
151 39
(Ảnh) Tiếp tục sêri (Link) lần này, chúng ta sẽ cùng tìm hiểu và mô phỏng lại một chức năng mà mọi người đang bắt đầu sử dụng hằng ngày, đó là chứ...
Huy Trần viết hơn 2 năm trước
151 39
White
108 17
Phần 1: Tự truyện Tui và Toán đã từng là hai kẻ thù không đội trời chung trong suốt hơn mười lăm năm ròng rã. Ngay từ ánh nhìn đầu tiên đã ghét nh...
Huy Trần viết hơn 2 năm trước
108 17
Bài viết liên quan
White
10 2
Makefile thực hiện một số thao tác thường dùng trong Go Khi làm project Go mình thường tạo một file Makefile dạng này: Lưu ý nhớ thay thành tên m...
Huy Trần viết hơn 2 năm trước
10 2
White
27 3
Introduction Buffering (buffered IO) là một trong những kỹ thuật kinh điển khi chúng ta cần đọc/ghi dữ liệu. Trong bài viết này mình sẽ đi sâu hơn...
Linh Tran Tuan viết 1 năm trước
27 3
White
2 0
Go không phải một ngôn ngữ hướng đối tượng (OOP). Tuy nhiên chúng ta có thể áp dụng một số ưu điểm của hướng đối tượng vào trong Go. Chúng ta có (...
Robin Huy viết 6 tháng trước
2 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

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


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