Trong bài viết này chúng ta sẽ cùng nhau tìm hiểu về biến trong Go.
Biến 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 các biến trong Go.
Khai báo biến đơn
var tên kiểu
là cú pháp để khai báo một biến đơn
package main import "fmt" func main() { var age int // Khai báo biến fmt.Println("my age is", age) }
Câu lệnh var age int
khai báo một biến tên là age
với kiểu int
, không có bất kỳ giá trị nào được gán cho biến này. Nếu một biến không được gán giá trị, Go tự động gán giá trị mặc định 0 theo kiểu của biến. Trong trường hợp này age
được gán bằng 0. Nếu bạn chạy chương trình này, bạn có thể nhìn thấy kết quả đầu ra như sau
my age is 0
Một biến có thể được gán cho bất kỳ giá trị nào phù hợp với kiểu của nó. Trong chương trình ở bên trên age
có thể được gán bất kỳ giá trị nào với kiểu là số nguyên.
package main import "fmt" func main() { var age int // Khai báo biến fmt.Println("my age is ", age) age = 29 // gán giá trị fmt.Println("my age is", age) age = 54 // gán giá trị fmt.Println("my new age is", age) }
Kết quả
my age is 0 my age is 29 my new age is 54
Khai báo một biến với giá trị khởi tạo
Một biến có thể được gán một giá trị khởi tạo khi khai báo biến.
var tên kiểu = giá trị khởi tạo
là cú pháp dùng để khai báo một biến với giá trị khởi tạo.
package main import "fmt" func main() { var age int = 29 // khai báo một biến với giá trị khởi tạo fmt.Println("my age is", age) }
age
là biến với kiểu int
và có giá trị khởi tạo là 29.
Nếu bạn chạy chương trình bạn sẽ nhận được kết quả như sau. Nó cho thấy rằng age
được gán giá trị khởi tạo là 29
my age is 29
Suy luận kiểu
Nếu một biến có một giá trị khởi tạo, Go có thể tự động suy luận ra kiểu của biến sử dụng giá trị khởi tạo đó. Vì thế nếu một biến có một giá trị khởi tạo thì kiểu trong khai báo biến có thể được bỏ qua.
Do đó nếu khai báo biến sử dụng cú pháp var tên = giá trị khởi tạo
, Go sẽ tự động suy luận ra kiểu của biến từ giá trị khởi tạo
Trong ví dụ sau đây, bạn có thể thấy rằng kiểu int của biến age
đã được loại bỏ tại dòng thứ 6. Vì biến có giá trị khởi tạo là 29, Go có thể suy luận ra kiểu của nó là int
.
package main import "fmt" func main() { var age = 29 // kiểu sẽ được suy luận ra fmt.Println("my age is", age) }
Khai báo nhiều biến
Chúng ta có thể khai báo nhiều biến trong một câu lệnh đơn.
var tên1, tên2 kiểu = giá trị khởi tạo 1, giá trị khởi tạo 2
là cú pháp để khai báo nhiều biến một lúc.
package main import "fmt" func main() { var width, height int = 100, 50 //khai báo nhiều biến fmt.Println("width is", width, "height is", height) }
Kiểu có thể được bỏ qua nếu các biến có giá trị mặc định. Chương trình bên dưới đây khai báo nhiều biến sử dụng suy luận kiểu
package main import "fmt" func main() { var width, height = 100, 50 //"int" được bỏ đi fmt.Println("width is", width, "height is", height) }
Kết quả
width is 100 height is 50
Có thể giờ đây bạn sẽ suy luận ra được là nếu giá trị khởi tạo không được gán cho width
và height
, thì giá trị mặc định 0 sẽ được gán cho.
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) }
Kết quả
width is 0 height is 0 new width is 100 new height is 50
Có thể có trường hợp chúng ta muốn khai báo các biến thuộc kiểu khác nhau trong một câu lệnh duy nhất. Cú pháp để làm điều này là
var ( tên1 = giá trị mặc định1 tên2 = giá trị mặc định2 )
Hãy cùng xem ví dụ sau đây sử dụng cú pháp bên trên để khai báo biến với 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) }
Ở đây chúng ta khai báo một biến name
với kiểu string
, age
và height
với kiểu int
Kết quả
my name is naveen , age is 29 and height is 0
Khai báo ngắn gọn
Go cũng cung cấp cách ngắn gọn khác để khai báo biến, sử dụng toán tử :=
tên := giá trị khởi tạo
– cú pháp ngắn gọn để khai báo biến
package main import "fmt" func main() { name, age := "naveen", 29 //Khai báo ngắn gọn fmt.Println("my name is", name, "age is", age) }
Kết qủa
my name is naveen age is 29
Khai báo ngắn gọn yêu cầu có giá trị mặc định cho tất cả các biến nằm ở phái bên trái của khai báo. Trong trường hợp age
không được gán giá trị, chương trình sẽ đưa ra một lỗi cannot assign 1 values to 2 variables
package main import "fmt" func main() { name, age := "naveen" // Lỗi fmt.Println("my name is", name, "age is", age) }
Cú pháp ngắn gọn chỉ có thể được sử dụng khi ít nhất một trong các biến trong phía bên trái của :=
được khai báo mới. Hãy cùng xem ví dụ sau
package main import "fmt" func main() { a, b := 20, 30 // khai báo các biến a và b fmt.Println("a is", a, "b is", b) b, c := 40, 50 // b đã được khai báo nhưng c thì mới fmt.Println("b is", b, "c is", c) b, c = 80, 90 // gán các giá trị mới cho các biến đã được khai báo b và c fmt.Println("changed b is", b, "c is", c) }
Như chúng ta đã thấy, tại hàng số 8 thì b
đã được khai báo nhưng c
thì mới.
Kết quả
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 ví dụ bên dưới đây
package main import "fmt" func main() { a, b := 20, 30 //a và b được khai báo fmt.Println("a is", a, "b is", b) a, b := 40, 50 // Lỗi, không có biến mới }
Nó sẽ đưa ra một lỗi no new variables on left side of :=
. Điều này là bởi vì cả 2 biến a
và b
đã được khai báo, và không có biến mới nào ở phía bên trái :=
Các biến cũng có thể được gán các giá trị được tính toán trong lúc chạy. Hãy xem chương trình sau
package main import ( "fmt" "math" ) func main() { a, b := 145.8, 543.8 c := math.Min(a, b) fmt.Println("minimum value is ", c) }
Giá trị c
được tính toán trong lúc chạy, do dó giá trị nhỏ nhất của a
và b
được in ra như sau
minimum value is 145.8
Vì Go là kiểu tĩnh, các biến được khai báo thuộc về một kiểu và không thể được gán giá trị của kiểu khác. Nếu chúng ta khai báo age
kiểu số nguyên và thử gán cho nó giá trị kiểu string
thì chương trình sẽ đưa ra một lỗi cannot use "naveen" (type string) as type int in assignment
package main func main() { age := 29 // age là int age = "naveen" // lỗi vì chúng ta thử gán giá trị string cho kiểu int }