DEV Community

meotism
meotism

Posted on • Edited on

Go basic

  • Tải Go và set up environment config Linux:

sudo apt update
sudo apt upgrade
sudo apt install golang-go
source ~/.bash_profile
go version
Sau khi cài đặt và set up xong, sử dụng câu lệnh:
go env
Workplace environment variable sẽ hiện ở GOPATH: /home/tuan/.go(tùy từng máy)

  • Workspace:dùng để import các custom package vào project. Đầu tiên phải truy cập các folder chứa package đã viết dùng câu lệnh: go mod init [tên modules]/package(tên modules thường là tên project)

Sau khi tạo xong truy cập folder project và dùng câu lệnh:
go work init để tạo ra một file go.work. Viết các đường dẫn đến package đã viết.

Vậy là các custom package đã có thể sử dụng.

  • Go CLI:
    build: biên dịch thành ứng dụng.
    clean: xóa files
    install: cài đặt package
    get -u: tải và cài đặt package
    list: liệt kê các package
    run: biên dịch chạy chương trình
    fix: tool fix package
    test: test package
    version: version go đã cài
    env: hiển thị thông tin go environment

  • Các kiến thức cơ bản:

  1. Variables:
    var dùng để tạo 1 hay nhiều giá trị.
    Go sẽ tự đề xuất kiểu dữ liệu đã được tạo.
    Image description
    Có 2 cách khai báo:
    1) var a = "hello"
    2) a := "hello"

  2. Constant
    const dùng để tạo hằng số (biến có giá trị không đổi). const không thể được gán với 1 giá trị được trả về bởi hàm. Ngoài ra hằng số chuỗi có 1 số trường hợp sau:
    Image description
    Nhưng khi cho a = b thì chương trình bị lỗi do a và b khác kiểu dữ liệu.

3.Type:

  • Basic type: int, float, complex, string, booleans.
  • Aggregate type: Array, struct.
  • Reference type: Pointer, slice, maps, function, channel, buffer channel,...
  • Interface type

4.Function

Thủ tục hàm dùng để thực hiện một nhiệm vụ nhất định. Hàm nhận input vào xử lý và trả về output.
Cách khai báo:
func plus(a int, b int) int{
return (a + b)
}

input: a,b có kiểu dữ liệu là int
output: có kiểu dữ liệu là int và kết quả a + b

5.Packages

Mọi chương trình go đều có packages.
Package giống như thư viện hàm hỗ trợ sẵn của go.


  • Array: là mảng chứa các phần tử và số lượng phần tử cố định (không thể thay đổi).Phải biết số lượng phần tử lúc tạo.

a := []int{7, 2, 8, -9, 4, 0}

var a[5]string

  • Slice: là mảng chứa các phần tử và thay đổi được số lương phần tử. Không cần biết số phần tử lúc tạo.

Ví dụ:
s := make([]string,3)
var b []string
a[2:] xóa 2 phần tử đầu tiên.
a = append(a, 3): thêm 3 vào cuối slice

  • Map: là kiểu dữ liệu key: value.

type months map[string] int
m := months{"Jan":31, "Feb":28}


OOP --------> Go
Encapsulation --> Packages
Inheritance ----> Composition
Polymorphism ---> Interfaces
Abstraction ----> Embedding

  • Pointer: là lấy giá trị của biến địa chỉ đã cho(tham chiếu ngược). Gía trị 0 có con trỏ là nil. Go không hỗ trợ phép toán trên con trỏ.
    b := []int{1,2}
    a := &b (khi đó *a = b)
    a++

  • Struct: Giống như struct ngôn ngữ C.
    Cách định nghĩa:
    type Person struct{
    name string
    age int
    }

    type Skills [] string
    type Student struct{
    Person
    Skills
    specialty string
    }

Khi khởi tạo struct, hãy sử dụng tên của thuộc tính
Giả sử thêm thuộc tính vào struct thì chương trình vẫn chạy bình thường.

  • Methods: function có input vào là struct hoặc non-struct.

Những lưu ý khi dùng methods:

  • Nếu 2 methods cùng tên thì phải thuộc 2 struct khác nhau(đối với hàm thì không được trùng tên còn method thì được nếu kiểu dữ liệu khác nhau).
  • Method có nhận kiểu dữ liệu là con trỏ
  • Interface: là tổng hợp các method của struct.(struct có tất cả phương thức trong một interface thì struct đó được gọi là implement interface đó)

  • GoRoutine: Dùng để xử lý đồng thời nhiều tác vụ. Được quản lý bởi package runtime và không phụ thuộc bởi phần cứng. 1 goroutine bắt đầu vùng nhớ stack nhỏ. Khi chương trình chạy k đủ không gian stack, goroutine sẽ tự động tăng không gian stack. Khi 1 chương trình chạy xong thì goroutine sẽ tự hủy. Vì không biết hàm goroutine bao lâu thực hiện nên sẽ dùng đến channel hoặc sync.WaitGroup. Cú pháp goroutine là:

go func(){*to do*}()

  • Channel: Dùng để kết nối các goroutines để chia sẻ dữ liệu. Cú pháp khởi tạo:

c:= make(chan int) là channel chứa dữ liệu int
Gửi dữ liệu vào channel: c <-
Nhập dữ liệu từ channel: <- c
Khi chỉ khai báo channel mà k có goroutine sẽ lỗi vì chưa có đầu nhận dữ liệu.

  • Channel Buffer: kết hợp goroutine và channel. Có giới hạn số lượng gửi dữ liệu vào. Khởi tạo: c: = make(chan int,2)
  • Select: Dùng để điều khiển gửi và nhập dữ liệu của channel(giống switch nhưng khác điều kiện là gửi và nhập dữ liệu của channel)
  • Mutex: Dùng để ngăn chặn truy cập một vùng nhớ bởi nhiều Routine trong cùng một thời điểm. Mutex có 2 phương thức Lock() và Unlock() quản lý bởi package sync. Cách khai báo: var mu sync.Mutex

Lưu ý: Khi thao tác ảnh hưởng đến 1 dữ liệu ví dụ là 3 trong goroutines thì ứng với từng goroutine giá trị 3 sẽ thay đổi khác nhau nên khi trả về kết quả sẽ sai. Thay vào đó ta thêm mutex sẽ đảm bảo giá trị 3 qua từng go routine đều lấy đúng kết quả sau từng lần chạy.


  • Defer:
  • Error:
  • Panic:
  • Recover:

Heroku

Build apps, not infrastructure.

Dealing with servers, hardware, and infrastructure can take up your valuable time. Discover the benefits of Heroku, the PaaS of choice for developers since 2007.

Visit Site

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay