Bài trước mình đã tìm hiểu về Câu lệnh điều khiển, điều kiện & vòng lặp trong Golang và cách thức triển khai như thế nào trong lập trình Golang rồi.
Để tiếp tục với series học lập trình Golang, trong bài viết này mình sẽ giới thiệu về khai báo hàm hay còn có thể gọi lại function declaration.
Vậy hàm là gì trong lập trình Golang?
Đây là kiến thức nền tảng trong lập trình bất kỳ ngôn ngữ khác như C, C++, CSharp, PHP,… Trong Golang, hàm (function) cũng là một khối mã, tương tự như trong các ngôn ngữ lập trình khác, nhưng có cú pháp khác biệt. Hàm trong Golang có thể nhận đầu vào (tham số) và trả về một giá trị.
func funcName(params ParamTypeValue, ...) returnType{
// code của hàm
return returnType
}
Trong đó:
func
là từ khóa để bắt đầu khai báo một hàm.funcName
là tên của hàm, được đặt theo quy tắc đặt tên biến.params
, … là các tham số được truyền vào hàm, mỗi tham số được chỉ định với một kiểu dữ liệu cụ thể.returnType
là kiểu dữ liệu của giá trị được trả về bởi hàm.- Phần thân của hàm được bao quanh bởi cặp dấu ngoặc nhọn
{}
. return
được sử dụng để trả về giá trị của hàm.
Khai báo hàm trong Golang
Để khai báo một hàm trong Golang, sử dụng từ khóa "func"
và sau đó là tên của hàm, danh sách các tham số (nếu có) và kiểu dữ liệu trả về (nếu có). Sau đó, sử dụng dấu ngoặc nhọn "{}"
để bao quanh thân của hàm.
func add(a int, b int) int {
return a + b
}
Trong Golang, các hàm có thể được phân loại vào các loại khác nhau dựa trên cách chúng được sử dụng và chức năng của chúng. Dưới đây là các loại hàm phổ biến trong Golang:
1. Hàm không có giá trị trả về (void function)
Đây là các hàm không trả về bất kỳ giá trị nào và được sử dụng để thực hiện một tác vụ nào đó.
func printMsg(msg string) {
fmt.Println(msg)
}
2. Hàm có giá trị trả về
Những hàm này trả về một giá trị nhất định sau khi thực hiện tác vụ được xác định bên trong chúng
func add(a int, b int) int {
return a + b
}
func sayHello() string {
return fmt.Sprintf("Hello World")
}
3. Hàm đệ quy
Đây là hàm tự sướng, tức là gọi lại chính nó trong quá trình thực thi chương trình.
func factory(n int) int {
if n == 0 {
return 1
}
return n * factory(n-1)
}
4. Hàm vô danh
Các hàm này không có tên và được sử dụng để truyền vào các biến hàm (function variable) hoặc truyền vào các tham số của hàm khác.
func main() {
func(msg string) {
fmt.Println(msg)
}("Hello World")
}
5. Hàm phương thức (method)
Các hàm phương thức được gắn kết với các kiểu dữ liệu nhất định và được sử dụng để thực hiện các tác vụ liên quan đến kiểu dữ liệu đó.
type Circle struct {
radius float64
}
func (c Circle) area() float64 {
return math.Pi * c.radius * c.radius
}
Khai báo hàm trả về nhiều giá trị (Multiple return values)
Đối với Golang, hàm có thể trả về nhiều giá trị (multiple return values) thay vì chỉ một giá trị như các ngôn ngữ lập trình khác. Điều này cho phép lập trình viên trả về nhiều giá trị từ hàm một cách tiện lợi và hiệu quả hơn!
Với ví dụ dưới đây, mình sẽ demo một hàm tính toán giá trị lớn nhất và nhỏ nhất của một slice:
func minMax(slice []int) (int, int) {
if len(slice) == 0 {
return 0, 0
}
min := slice[0]
max := slice[0]
for _, value := range slice {
if value < min {
min = value
}
if value > max {
max = value
}
}
return min, max
}
Trong ví dụ trên, hàm minMax
trả về hai giá trị nguyên là giá trị nhỏ nhất và lớn nhất của slice được truyền vào. Để trả về nhiều giá trị, ta sử dụng cú pháp (int, int)
đại diện cho hai giá trị trả về của hàm. Trong trường hợp slice truyền vào rỗng, hàm sẽ trả về hai giá trị bằng 0.
Khi gọi hàm có nhiều giá trị trả về, ta cần phải sử dụng các biến để lưu trữ các giá trị này
slice := []int{3, 6, 2, 1, 8, 4}
min, max := minMax(slice)
fmt.Printf("Min: %d, Max: %d", min, max)
Trong đoạn mã trên, chúng ta gọi hàm minMax
và lưu trữ giá trị nhỏ nhất và lớn nhất vào các biến min
và max
để sử dụng sau này.
Lưu ý:
Multiple return values sẽ được vận dụng rất nhiều trong quá trình bạn làm việc với Golang
Kết bài
Trong bài viết này, chúng ta đã tìm hiểu cách khai báo hàm trong Golang và cách sử dụng chúng như thế nào. Cảm ơn các bạn đã dành thời gian nghiêng cứu bài viết này. Mọi thắc mắc và gợi ý gì cho mình vui lòng comment phía dưới bài viết, mình sẽ giải đáp cho các bạn! Ngoài ra các bạn có thể truy cập vào tài liệu của Golang để cập nhật thêm thông tin nhé! Thân ái!