- vừa được xem lúc

Golang cơ bản (Phần 2: một số thành phần cơ bản trong Go)

0 0 20

Người đăng: Nguyễn Văn Huy

Theo Viblo Asia

Ở phần 1 mình đã giới thiệu và hướng dẫn các bạn cài đặt và chạy thử Golang trên Ubuntu, sang phần 2 mình tiếp tục giới thiệu cho các bạn về các thành phần cơ bản trong Go, chúng ta cùng bắt đầu nhé.

Biến

Cách khai báo và sử dụng biến là điều đầu tiên cần biết khi bắt đầu với ngôn ngữ mới. Trong Go, biến phải được xác định, định nghĩa rõ ràng và có thể được khai báo bằng nhiều cách khác nhau bằng từ khóa var

1 số cách khai báo biến cơ bản mà bạn cần biết:

package main import "fmt" func main() { ///Cach 1: var a = true fmt.Println("a = ", a) //Cach 2: b := "Hello World!" fmt.Println("b = ", b) //Cach 3: var c, d int = 10, 20 fmt.Printf("c = %d\nd = %d\n", c, d) // Cach 4: var e float32 e = 0.5 fmt.Println("e = ", e) // Cach 5: str, num := "string", 10 fmt.Printf("str = %s\nnum = %d\n", str, num) //Cach 6: var ( name = "Nguyen Van Huy" age = 23 height int ) fmt.Println("my name is", name, ", age is", age, "and height is", height)
}

Output:

a = true
b = Hello World!
c = 10
d = 20
e = 0.5
str = string
num = 10
my name is Nguyen Van Huy , age is 23 and height is 0

Hằng số

Cũng giống các ngôn ngữ khác thì Hằng số là một giá trị cố định và không thay đổi và để khai báo hằng số trong Go chúng ta sử dụng từ khóa const. Go hỗ trợ hằng số cho ký tự (character), chuỗi (string), kiểu bool (boolean), và các giá trị số (numeric values).

Từ khóa const có thể khai báo ở bất cứ đâu mà từ khóa var có thể.

package main import "fmt" const str string = "String" func main() { fmt.Println("str = ", str) const num = 10 fmt.Println("num = ", num) const ( name = "Nguyen Van Huy" age = 23 country = "Viet Nam" ) fmt.Println("name = ", name) fmt.Println("age = ", age) fmt.Println("country = ", country)
}

Output:

str = String
num = 10
name = Nguyen Van Huy
age = 23
country = Viet Nam

Câu lệnh điều kiện

Tương tự với các ngôn ngữ khác thì cú pháp của lệnh điều khiển trong golang cũng là if .... else. Và đặc biệt là có thể gán giá trị hoặc lấy giá trị từ một hàm nào đó trên cú pháp của lệnh if.

package main import ( "fmt" "math/rand"
) func getRandNumber(n int) int { return rand.Intn(n)
} func main() { num := 99 if num <= 50 { fmt.Println(num, "is less than or equal to 50") } else if num >= 51 && num <= 100 { fmt.Println(num, "is between 51 and 100") } else { fmt.Println(num, "is greater than 100") } if num := getRandNumber(20); num > 10 { fmt.Println(num, "is greater than 10") } else if num < 10 { fmt.Println(num, "is smaller than 10") } else { fmt.Println(num, "is equal to 10") }
}

Output:

99 is between 51 and 100
1 is smaller than 10

Do golang không hỗ trợ toán tử 3 ngôi (Ternary Operator) nên nhiều khi phải sử dùng if .... else dẫn đến code dài hơn xíu :v

Vòng lặp

Go hỗ trợ vòng lặp For nhưng lại không hỗ trợ vòng lặp While, vì thế nếu chúng ta muốn sử dụng vòng lặp While thì phải sử dụng cú pháp của vòng lặp For để thay thế cho While.

Có vài kiểu vòng lặp cơ bản như sau:

package main import ( "fmt"
) func main() { // Cach 1: for i := 1; i <= 10; i++ { if i > 5 { break //loop is terminated if i > 5 } if i%2 == 0 { continue } fmt.Printf("%d ", i) } fmt.Printf("\nline after for loop") // Cach 2: for i := 0; i < 3; i++ { for j := 1; j < 4; j++ { fmt.Printf("i = %d , j = %d\n", i, j) } } // Cach 3: i := 0 for i <= 10 { //semicolons are ommitted and only condition is present fmt.Printf("%d ", i) i += 2 } // Cach 4: for no, i := 10, 1; i <= 10 && no <= 19; i, no = i+1, no+1 { //multiple initialisation and increment fmt.Printf("%d * %d = %d\n", no, i, no*i) }
}

Function

Trong Go, để khai báo một functions ta dùng từ khóa func.

Cú pháp chung để khai báo một function là:

func functionname(parametername type) returntype { //function body
}

Các tham số và kiểu trả về (return) được tùy chọn trong một function. Do đó cú pháp bên dưới cũng hợp lệ

func functionname() { }

Mình sẽ viết một function calculate với tham số đầu vào là 2 số nguyên và phép tính, sau đó thực hiện phép tính giữa 2 số nguyên đó nhé.

Ở đây mình cũng sẽ viết ra các function theo từng phép tính.

package main import ( "fmt"
) func add(number1, number2 int) int { return number1 + number2
} func multiply(number1, number2 int) int { return number1 * number2
} func divide(number1, number2 int) int { if number2 == 0 { panic("you can not divide to 0") //or replace panic with fmt.Println(); } return number1 / number2
} func substract(number1, number2 int) int { return number1 - number2
} func calculate(a, b int, cal string) int { switch cal { case "add": return add(a, b) case "multiply": return multiply(a, b) case "divide": return divide(a, b) case "substract": return substract(a, b) default: return 0 }
} func main() { a, b := 10, 2 add := calculate(a, b, "add") multiply := calculate(a, b, "multiply") divide := calculate(a, b, "divide") substract := calculate(a, b, "substract") fmt.Println("add =", add) fmt.Println("multiply =", multiply) fmt.Println("divide =", divide) fmt.Println("substract =", substract)
}

Output:

add = 12
multiply = 20
divide = 5
substract = 8

Bên trên là mình ví dụ về function chỉ có 1 giá trị trả về, tiếp theo sẽ là function có nhiều giá trị trả về nhé.

Hàm trả về nhiều giá trị (Multiple Return Values) trong Golang có nhiều cách viết như:

  • Cách 1: Hàm với giá trị trả về
  • Cách 2: Hàm khai bào trước tên của giá trị trả về, nếu đã khai báo trước giá trị trả về thì chỉ cần có return mà không cần phải bỏ các giá trị bên cạnh từ khóa return
  • Cách 3: Hàm khai báo trước tên giá trị trả về với cách viết rút gọn kiểu trả về nếu tất cả các giá trị trả về cùng kiểu.

Sau đây là ví dụ cho cả 3 cách trên:

package main import "fmt" func rectPerimeter(a int, b int) int { return (a + b) * 2
} func rectArea(a, b int) int { return a * b
} // Cach 1:
func rectPeriAndArea1(a, b int) (int, int) { rectPeri := rectPerimeter(a, b) rectArea := rectArea(a, b) return rectPeri, rectArea
} // Cach 2:
func rectPeriAndArea2(a, b int) (rectPeri int, rectAr int) { rectPeri = rectPerimeter(a, b) rectAr = rectArea(a, b) return
} // Cach 3:
func rectPeriAndArea3(a, b int) (rectPeri, rectAr int) { rectPeri = rectPerimeter(a, b) rectAr = rectArea(a, b) return
} func main() { a := 10 b := 2 rectPeri1, rectAr1 := rectPeriAndArea1(a, b) fmt.Printf("rectPeri1=%d, rectAr1=%d\n", rectPeri1, rectAr1) rectPeri2, rectAr2 := rectPeriAndArea2(a, b) fmt.Printf("rectPeri2=%d, rectAr2=%d\n", rectPeri2, rectAr2) rectPeri3, rectAr3 := rectPeriAndArea3(a, b) fmt.Printf("rectPeri3=%d, rectAr3=%d\n", rectPeri3, rectAr3)
}

Variadic Function

Hàm bất định (Variadic Function) trong Golang là một hàm chấp nhận số lượng đối số khác nhau và không biết trước. Nếu parameter cuối cùng được bắt đầu với dấu ellipsis ..., thì function có thể nhận bất kì argument nào cho parameter đó.

Chú ý rằng, chỉ có parameter cuối cùng có thể variadic.

Syntax của một variadic function:

func hello(a int, b ...int) {
}

Sau đây là ví dụ về variadic function:

package main import "fmt" func max(nums ...int) { if len(nums) == 0 { fmt.Println("not found in", nums) } else { result := nums[0] for _, num := range nums { if result < num { result = num } } fmt.Println("max of", nums, "is", result) }
} func main() { max(10, 23, 123, 12, 44) max() nums := []int{34, 33, 66, 11, 1, 100} // nums... = 34, 33, 66, 11, 1, 100 max(nums...)
}

Output:

max of [10 23 123 12 44] is 123
not found in []
max of [34 33 66 11 1 100] is 100

Tổng kết

Các bạn hãy nhớ theo dõi mình để câp nhật các phần tiếp theo về series golang cơ bản này nhé. Cảm ơn các bạn rất nhiều ❤️

Tài liệu tham khảo

https://golangbot.com/learn-golang-series/

Bình luận

Bài viết tương tự

- vừa được xem lúc

gRPC - Nó là gì và có nên sử dụng hay không?

Nhân một ngày rảnh rỗi, mình ngồi đọc lại RPC cũng như gRPC viết lại để nhớ lâu hơn. Vấn đề là gì và tại sao cần nó .

0 0 131

- vừa được xem lúc

Embedded Template in Go

Getting Start. Part of developing a web application usually revolves around working with HTML as user interface.

0 0 56

- vừa được xem lúc

Tạo Resful API đơn giản với Echo framework và MySQL

1. Giới thiệu.

0 0 60

- vừa được xem lúc

Sử dụng goquery trong golang để crawler thông tin các website Việt Nam bị deface trên mirror-h.org

. Trong bài viết này, mình sẽ cùng mọi người khám phá một package thu thập dữ liệu có tên là goquery của golang. Mục tiêu chính của chương trình crawler này sẽ là lấy thông tin các website Việt Nam bị deface (là tấn công, phá hoại website, làm thay đổi giao diện hiển thị của một trang web, khi người

0 0 237

- vừa được xem lúc

Tạo ứng dụng craw dữ liệu bing với Golang, Mysql driver

Chào mọi người . Lâu lâu ta lại gặp nhau 1 lần, để tiếp tục series chia sẻ kiến thức về tech, hôm nay mình sẽ tìm hiểu và chia sẻ về 1 ngôn ngữ đang khá hot trong cộng đồng IT đó là Golang.

0 0 75

- vừa được xem lúc

Golang: Rest api and routing using MUX

Routing with MUX. Let's create a simple CRUD api for a blog site. # All . GET articles/ .

0 0 54