Biến trong Go

Đây là hướng dẫn thứ ba trong loạt bài hướng dẫn lập trình Go của chúng tôi và nó đề cập đến các biến trong Go.

Trong hướng dẫn này, chúng ta sẽ tìm hiểu về biến là gì, các cách khai báo biến và các lỗi thương gặp liên quan tới biến trong Go.

Biến là gì?

Biến (variable) là tên được đặt cho một vị trí bộ nhớ để lưu trữ giá trị của một kiểu cụ thể. Có nhiều cú pháp khác nhau để khai báo biến trong Go. Hãy xem xét từng cái một.

Khai báo một biến duy nhất

var name type là cú pháp để khai báo một biến duy nhất.

package main

import "fmt"

func main() {  
    var age int // variable declaration
    fmt.Println("My age is", age)
}

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

Câu lệnh var age int khai báo một biến có tên age kiểu int. Chúng ta chưa gán bất kỳ giá trị nào cho biến này. Nếu một biến không được gán bất kỳ giá trị nào, Go sẽ tự động khởi tạo nó zero value của kiểu dữ liệu đó.

Trong trường hợp này, biến age được gán giá trị 0, chính là zero value của kiểu int. Nếu bạn chạy chương trình này, bạn có thể thấy kết quả sau.

My age is 0  

Một biến có thể được gán cho bất kỳ giá trị nào thuộc kiểu của nó. Trong chương trình trên, age có thể được gán bất kỳ giá trị kiểu số nguyên nào.

package main

import "fmt"

func main() {  
    var age int // variable declaration
    fmt.Println("My age is", age)
    age = 29 //assignment
    fmt.Println("My age is", age)
    age = 54 //assignment
    fmt.Println("My new age is", age)
}

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

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

My age is  0  
My age is 29  
My new age is 54  

Khai báo một biến với giá trị ban đầu

Một biến cũng có thể được cung cấp một giá trị ban đầu khi nó được khai báo. Sau đây là cú pháp để khai báo một biến có giá trị ban đầu.

var name type = initialvalue  
package main

import "fmt"

func main() {  
    var age int = 29 // variable declaration with initial value

    fmt.Println("My age is", age)
}

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

Trong chương trình trên, age là một biến kiểu int và có giá trị ban đầu 29. Chương trình trên sẽ in kết quả sau.

My age is 29  

Nó cho thấy rằng tuổi đã được khởi tạo với giá trị 29.

Kiểu suy luận

Nếu một biến có giá trị ban đầu, Go sẽ tự động có thể suy ra kiểu của biến đó bằng cách sử dụng giá trị ban đầu đó. Do đó, nếu một biến có giá trị ban đầu, thì giá trị type trong khai báo biến có thể được loại bỏ.

Nếu biến được khai báo bằng cú pháp sau

var name = initialvalue  

Go sẽ tự động suy ra kiểu của biến đó từ giá trị ban đầu.

Trong ví dụ sau, chúng ta có thể thấy rằng khai báo kiểu int của biến age đã bị loại bỏ ở dòng số 6. Vì biến có giá trị ban đầu 29, nên Go có thể suy ra rằng nó có kiểu int.

package main

import "fmt"

func main() {  
    var age = 29 // type will be inferred
    fmt.Println("My age is", age)
}

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

Khai báo nhiều biến

Nhiều biến có thể được khai báo bằng một câu lệnh duy nhất.

Cú pháp khai báo nhiều biến như sau.

var name1, name2 type = initialvalue1, initialvalue2
package main

import "fmt"

func main() {  
    var width, height int = 100, 50 //declaring multiple variables

    fmt.Println("width is", width, "height is", height)
}

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

Các kiểu có thể được loại bỏ nếu các biến có giá trị ban đầu. Vì chương trình trên có các giá trị ban đầu cho các biến nên khai báo kiểu int có thể được loại bỏ.

package main

import "fmt"

func main() {  
    var width, height = 100, 50 //"int" is dropped

    fmt.Println("width is", width, "height is", height)
}

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

Chương trình trên sẽ in kết quả sau ở đầu ra.

width is 100 height is 50

Như bạn đã biết, nếu giá trị ban đầu không được chỉ định cho biến width và height, giá trị 0 sẽ được gán làm giá trị ban đầu của chúng.

package main

import "fmt"

func main() {  
    var width, height int
    fmt.Println("width is", width, "height is", height)
    width = 100
    height = 50
    fmt.Println("new width is", width, "new height is", height)
}

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

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

width is 0 height is 0  
new width is 100 new height is 50  

Có thể có những trường hợp chúng ta muốn khai báo các biến thuộc các kiểu khác nhau trong một câu lệnh. Cú pháp để làm điều đó là:

var (  
      name1 = initialvalue1
      name2 = initialvalue2
)

Chương trình sau sử dụng cú pháp trên để khai báo các biến có kiểu khác nhau.

package main

import "fmt"

func main() {  
    var (
        name   = "naveen"
        age    = 29
        height int
    )
    fmt.Println("my name is", name, ", age is", age, "and height is", height)
}

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

Ở đây chúng ta khai báo một biến name kiểu string, ageheight kiểu int. (Chúng ta sẽ thảo luận về các loại khác nhau có sẵn trong Go trong hướng dẫn tiếp theo).

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

my name is naveen , age is 29 and height is 0  

Khai báo nhanh

Go cũng cung cấp một cách ngắn gọn khác để khai báo các biến. Đây được gọi là khai báo nhanh và nó sử dụng toán tử :=.

Cú pháp khai báo nhanh để khai báo một biến như sau:

name := initialvalue

Chương trình sau đây sử dụng cú pháp khai báo nhanh để khai báo biến count được khởi tạo giá trị là 10. Go sẽ tự động suy ra biến count là kiểu int vì nó đã được khởi tạo với giá trị số nguyên là 10.

package main

import "fmt"

func main() {  
    count := 10
    fmt.Println("Count =",count)
}

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

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

Count = 10  

Cũng có thể khai báo nhiều biến trong một dòng bằng cú pháp khai báo nhanh.

package main

import "fmt"

func main() {  
    name, age := "naveen", 29 //short hand declaration

    fmt.Println("my name is", name, "age is", age)
}

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

Chương trình trên khai báo hai biến nameage kiểu stringint tương ứng.

Nếu bạn chạy chương trình trên, bạn có thể thấy kết quả sau.

my name is naveen age is 29

Khai báo nhanh yêu cầu các giá trị ban đầu cho tất cả các biến ở phía bên trái của phép gán. Chương trình sau sẽ in lỗi assignment mismatch: 2 variables but 1 values. Điều này là do biến Age chưa được chỉ định một giá trị.

package main

import "fmt"

func main() {  
    name, age := "naveen" //error

    fmt.Println("my name is", name, "age is", age)
}

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

Cú pháp rút gọn chỉ có thể được sử dụng khi ít nhất một trong các biến ở phía bên trái của toán tử := mới được khai báo. Hãy xem xét chương trình sau đây,

package main

import "fmt"

func main() {  
    a, b := 20, 30 // declare variables a and b
    fmt.Println("a is", a, "b is", b)
    b, c := 40, 50 // b is already declared but c is new
    fmt.Println("b is", b, "c is", c)
    b, c = 80, 90 // assign new values to already declared variables b and c
    fmt.Println("changed b is", b, "c is", c)
}

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

Trong chương trình trên, ở dòng số 8, biến b đã được khai báo trước đó nhưng biến c mới được khai báo và do đó nó hoạt động và kết quả như sau:

a is 20 b is 30  
b is 40 c is 50  
changed b is 80 c is 90  

Trong khi nếu chúng ta chạy chương trình bên dưới sẽ gặp lỗi

package main

import "fmt"

func main() {  
    a, b := 20, 30 //a and b declared
    fmt.Println("a is", a, "b is", b)
    a, b := 40, 50 //error, no new variables
}

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

Nó sẽ in lỗi /prog.go:8:10: no new variables on left side of :=. Điều này là do cả hai biến ab đều đã được khai báo và không có biến mới nào ở phía bên trái của toán tử := ở dòng số 8.

Các biến cũng có thể được gán các giá trị được tính toán trong thời gian chạy. Hãy xem xét chương trình sau đây,

package main

import (  
    "fmt"
    "math"
)

func main() {  
    a, b := 145.8, 543.8
    c := math.Min(a, b)
    fmt.Println("Minimum value is", c)
}

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

Trong chương trình trên, math là một package và Min là một function trong package đó. Đừng lo lắng về điều đó ngay bây giờ, chúng ta sẽ thảo luận chi tiết về packagefunction trong các bài hướng dẫn sắp tới.

Tất cả những gì chúng ta cần biết là, giá trị của biến  c được tính tại thời gian chạy và nó là giá trị tối thiểu của hai biến ab. Chương trình trên sẽ in ra kết quả sau:

Minimum value is  145.8  

Vì Go được định kiểu mạnh, các biến được khai báo là thuộc một kiểu không thể được gán giá trị cho kiểu khác. Chương trình sau sẽ in lỗi cannot use "naveen" (type string) as type int in assignment vì biến age được khai báo là kiểu int và chúng tôi đang cố gắng gán giá trị kiểu string cho nó.

package main

func main() {  
    age := 29      // age is int
    age = "naveen" // error since we are trying to assign a string to a variable of type int
}

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

Trong hướng dẫn tiếp theo, chúng ta sẽ tìm hiểu về các kiểu dữ liệu trong Go.

Kiểu dữ liệu trong Go
Trong hướng dẫn này, chúng ta sẽ tìm hiểu về các kiểu dữ liệu cơ bản như kiểu bool, kiểu số, kiểu chuỗi và cách chuyển đổi kiểu dữ liệu trong Go.

Cảm ơn vì đã đọc. Vui lòng gửi phản hồi và thắc mắc của bạn trong phần bình luậ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.