Function trong Go

Trong hướng dẫn này, chúng ta sẽ tìm hiểu function là gì, cách khai báo function, tham số đầu vào, kiểu dữ liệu trả về, mã định danh trống của function trong Go.

Function là gì?

Function (hàm) là một khối mã thực hiện một nhiệm vụ cụ thể. Một function nhận đầu vào, thực hiện một số tính toán trên đầu vào và tạo ra một đầu ra.

Khai báo function

Cú pháp để khai báo một function như sau:

func functionName(parameterName type) returnType {  
    //function body
}

Khai báo function bắt đầu bằng một từ khóa func theo sau là functionName. Các tham số được chỉ định giữa cặp dấu ngoặc tròn (), theo sau function là returnType - kiểu trả về của function.

Cú pháp để chỉ định một tham số là tên tham số theo sau là kiểu. Bất kỳ số lượng tham số có thể được chỉ định như sau: (parameter1 type, parameter2 type). Sau đó, có một khối mã nằm giữa cặp dấu ngoặc nhọn {} - đó là phần thân của function.

Các tham số và kiểu trả về là tùy chọn trong một function. Do đó cú pháp sau đây cũng là một khai báo function hợp lệ.

func functionName() {  
}

Ví dụ về function

Hãy viết một function lấy giá của một sản phẩm và số lượng sản phẩm làm tham số đầu vào và tính tổng giá bằng cách nhân hai giá trị này và trả về kết quả đầu ra.

func calculateBill(price int, no int) int {  
    var totalPrice = price * no
    return totalPrice
}

Hàm trên có hai tham số đầu vào priceno kiểu int và nó trả về giá trị totalPrice là tích số của priceno. Giá trị trả về cũng thuộc kiểu int.

Nếu các tham số liên tiếp có cùng kiểu, chúng ta có thể bỏ qua khai báo kiểu cho mỗi tham số mà chỉ cần viết một lần ở cuối là đủ. Tức là price int, no int có thể được viết là price, no int . Do đó, function trên có thể được viết lại thành,

func calculateBill(price, no int) int {  
    var totalPrice = price * no
    return totalPrice
}

Bây giờ chúng ta đã có một function đã sẵn sàng, hãy gọi nó từ một nơi nào đó trong mã. Cú pháp để gọi một function là functionName(parameters). Function trên có thể được gọi bằng cách sử dụng mã sau:

calculateBill(10, 5)  

Đây là chương trình hoàn chỉnh sử dụng function trên và in tổng giá.

package main

import (  
    "fmt"
)

func calculateBill(price, no int) int {  
    var totalPrice = price * no
    return totalPrice
}

func main() {  
    price, no := 90, 6
    totalPrice := calculateBill(price, no)
    fmt.Println("Total price is", totalPrice)
}

Chạy chương trình trong Playground

Chương trình trên sẽ in ra kết quả như sau:

Total price is 540  

Function trả về nhiều giá trị

Có thể trả về nhiều giá trị từ một function. Hãy viết một function rectProps nhận vào hai tham số là lengthwidth của một hình chữ nhật và trả về cả diện tích và chu vi của hình chữ nhật. Diện tích của hình chữ nhật là tích của chiều dài và chiều rộng và chu vi bằng hai lần tổng chiều dài và chiều rộng.

package main

import (  
    "fmt"
)

func rectProps(length, width float64)(float64, float64) {  
    var area = length * width
    var perimeter = (length + width) * 2
    return area, perimeter
}

func main() {  
    area, perimeter := rectProps(10.8, 5.6)
    fmt.Printf("Area %f Perimeter %f", area, perimeter) 
}

Chạy chương trình trong Playground

Nếu một function trả về nhiều giá trị trả về thì chúng phải được chỉ định giữa cặp dấu ngoặc tròn (). func rectProps(length, width float64)(float64, float64) có hai tham số lengthwidth kiểu float64 và cũng trả về hai giá trị kiểu float64. Chương trình trên in kết quả như sau:

Area 60.480000 Perimeter 32.800000  

Giá trị trả về được đặt tên

Có thể trả về các giá trị được đặt tên từ một function. Nếu một giá trị trả về được đặt tên, nó có thể được coi là được khai báo như một biến trong dòng đầu tiên của function.

Hàm rectProps ở trên có thể được viết lại bằng cách sử dụng các giá trị trả về được đặt tên như sau:

func rectProps(length, width float64)(area, perimeter float64) {  
    area = length * width
    perimeter = (length + width) * 2
    return //no explicit return value
}

areaperimeter là các giá trị trả về được đặt tên trong function trên. Lưu ý rằng câu lệnh return trong function không trả về bất kỳ giá trị nào một cách rõ ràng. Vì areaperimeter được chỉ định trong khai báo function dưới dạng giá trị trả về, chúng được tự động trả về từ function khi gặp câu lệnh trả về.

Mã định danh trống

Ký tự _ được gọi là mã định danh trống trong Go. Nó có thể được sử dụng thay cho bất kỳ giá trị nào thuộc bất kỳ kiểu nào. Hãy xem công dụng của mã định danh trống này là gì.

Hàm rectProps trả về diện tích và chu vi của hình chữ nhật. Điều gì xảy ra nếu chúng ta chỉ cần area và muốn loại bỏ perimeter. Đây là nơi mã định danh trống _ được sử dụng.

Chương trình dưới đây chỉ sử dụng area trả về từ function rectProps.

package main

import (  
    "fmt"
)

func rectProps(length, width float64) (float64, float64) {  
    var area = length * width
    var perimeter = (length + width) * 2
    return area, perimeter
}
func main() {  
    area, _ := rectProps(10.8, 5.6) // perimeter is discarded
    fmt.Printf("Area %f ", area)
}

Chạy chương trình trong Playground

Trong dòng số 13 chúng ta chỉ sử dụng area và mã định danh trống _ được sử dụng để loại bỏ perimeter.

Trong hướng dẫn tiếp theo, chúng ta sẽ tìm hiểu về package, module trong Go.

Package trong Go
Trong hướng dẫn này, chúng ta sẽ tìm hiểu package là gì, cách tạo và quản lý package, cách tạo module, import package, ... trong Go.

Như thường lệ, cảm ơn bạn đã đọc. Vui lòng để lại ý kiến ​​và phản hồi có giá trị của bạn.

Nếu Comdy hữu ích và giúp bạn tiết kiệm thời gian làm việc

Bạn có thể vui lòng đưa Comdy vào whitelist của trình chặn quảng cáo ❤️ để hỗ trợ chúng tôi trong việc trả tiền cho dịch vụ lưu trữ web để duy trì hoạt động của trang web.

Go
Bài Viết Liên Quan:
Phương thức (method) trong Go
Trung Nguyen 02/12/2021
Phương thức (method) trong Go

Trong hướng dẫn này, chúng ta sẽ tìm hiểu phương thức (method) trong Go là gì? Cú pháp khai báo phương thức, so sánh phương thức với hàm, ... trong Go.

Struct trong Go
Trung Nguyen 28/11/2021
Struct trong Go

Trong hướng dẫn này, chúng ta sẽ tìm hiểu struct là gì, cách khai báo và sử dụng một struct trong Go, struct ẩn danh, so sanh hai struct, ...

Con trỏ trong Go
Trung Nguyen 28/11/2021
Con trỏ trong Go

Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách con trỏ (pointer) hoạt động trong Go và nó khác với con trỏ trong các ngôn ngữ khác như C và C++ như thế nào.

Chuỗi trong Go
Trung Nguyen 28/11/2021
Chuỗi trong Go

Chuỗi (string) xứng đáng được đề cập đặc biệt trong Go vì chúng khác biệt trong cách triển khai khi so sánh với các ngôn ngữ khác.