Biến và hằng số trong Go

Biến và hằng số là thành phần quan trọng trong lập trình, giúp lưu trữ và quản lý dữ liệu.

Định danh và từ khóa

Định danh

Trong ngôn ngữ lập trình, định danh là các từ do lập trình viên định nghĩa để biểu thị ý nghĩa đặc biệt, như tên biến, tên hằng số, tên hàm, v.v. Trong Go, định danh bao gồm chữ cái, chữ số và ký tự _ (dấu gạch dưới), và phải bắt đầu bằng chữ cái hoặc _. Ví dụ: abc, _, _123, a123.

Từ khóa

Từ khóa là các định danh được định nghĩa sẵn trong ngôn ngữ lập trình và có ý nghĩa đặc biệt. Từ khóa và từ đã được giữ lại không nên sử dụng làm tên biến.

Go có 25 từ khóa:

    break        default      func         interface    select
    case         defer        go           map          struct
    chan         else         goto         package      switch
    const        fallthrough  if           range        type
    continue     for          import       return       var

Ngoài ra, Go còn có 37 từ được giữ lại.

    Constants:    true  false  iota  nil

        Types:    int  int8  int16  int32  int64  
                  uint  uint8  uint16  uint32  uint64  uintptr
                  float32  float64  complex128  complex64
                  bool  byte  rune  string  error

    Functions:   make  len  cap  new  append  copy  close  delete
                 complex  real  imag
                 panic  recover

Biến

Nguồn gốc của biến

Dữ liệu trong quá trình chạy chương trình được lưu trữ trong bộ nhớ. Khi muốn thao tác với dữ liệu, chúng ta cần tìm đến địa chỉ bộ nhớ của biến. Tuy nhiên, việc sử dụng trực tiếp địa chỉ bộ nhớ trong mã nguồn sẽ làm giảm tính đọc và dễ gây lỗi. Do đó, chúng ta sử dụng biến để lưu địa chỉ bộ nhớ, giúp truy cập dữ liệu một cách dễ dàng.

Loại biến

Biến (Variable) dùng để lưu trữ dữ liệu. Các loại dữ liệu khác nhau yêu cầu các loại biến khác nhau. Sau nhiều thập kỷ phát triển, các ngôn ngữ lập trình đã hình thành một tập hợp các kiểu dữ liệu cố định, bao gồm: kiểu số nguyên, kiểu số thực, kiểu boolean, v.v.

Mỗi biến trong Go đều có kiểu dữ liệu riêng và phải được khai báo trước khi sử dụng.

Khai báo biến

Biến trong Go cần được khai báo trước khi sử dụng, và không hỗ trợ khai báo lặp lại trong cùng một phạm vi. Biến khai báo trong Go phải được sử dụng.

Khai báo tiêu chuẩn

Cú pháp khai báo biến trong Go:

var tên_biến kiểu_dữ_liệu

Khai báo biến bắt đầu bằng từ khóa var, kiểu dữ liệu đặt sau tên biến, không cần dấu chấm phẩy ở cuối dòng. Ví dụ:

var ten string
var tuoi int
var dung bool

Khai báo hàng loạt

Việc khai báo mỗi biến bằng var có thể trở nên rườm rà, Go hỗ trợ khai báo hàng loạt:

var (
    a string
    b int
    c bool
    d float32
)

Khởi tạo biến

Khi khai báo biến, Go tự động khởi tạo vùng bộ nhớ tương ứng. Mỗi biến được khởi tạo với giá trị mặc định của kiểu dữ liệu, ví dụ: kiểu số nguyên và số thực mặc định là 0, chuỗi mặc định là chuỗi rỗng, boolean mặc định là false, slice, hàm, con trỏ mặc định là nil.

Chúng ta cũng có thể khởi tạo biến ngay khi khai báo. Cú pháp khởi tạo biến:

var tên_biến kiểu_dữ_liệu = biểu_thức

Ví dụ:

var ten string = "Q1mi"
var tuoi int = 18

Hoặc khởi tạo nhiều biến cùng lúc:

var ten, tuoi = "Q1mi", 20

Đưa ra kiểu dữ liệu

Đôi khi, chúng ta có thể bỏ qua kiểu dữ liệu, khi đó trình biên dịch sẽ tự động xác định kiểu dữ liệu dựa trên giá trị bên phải dấu =.

var ten = "Q1mi"
var tuoi = 18

Khai báo ngắn gọn

Trong hàm, có thể sử dụng cú pháp := để khai báo và khởi tạo biến.

package main

import (
	"fmt"
)

// Biến toàn cục m
var m = 100

func main() {
	n := 10
	m := 200 // Khai báo biến cục bộ m
	fmt.Println(m, n)
}

Biến vô danh

Khi sử dụng gán nhiều giá trị, nếu muốn bỏ qua một giá trị, có thể sử dụng biến vô danh (anonymous variable). Biến vô danh được biểu thị bằng dấu gạch dưới _, ví dụ:

func foo() (int, string) {
	return 10, "Q1mi"
}

func main() {
	x, _ := foo()
	_, y := foo()
	fmt.Println("x=", x)
	fmt.Println("y=", y)
}

Biến vô danh không chiếm không gian tên, không phân bổ bộ nhớ, nên không có vấn đề về khai báo lặp lại. (Trong Lua và các ngôn ngữ khác, biến vô danh còn gọi là biến giả.)

Lưu ý:

  1. Mỗi câu lệnh bên ngoài hàm phải bắt đầu bằng từ khóa (var, const, func, v.v.).
  2. := không thể sử dụng bên ngoài hàm.
  3. Dùng _ để giữ chỗ, bỏ qua giá trị.

Hằng số

So với biến, hằng số là giá trị không thay đổi, thường dùng để định nghĩa các giá trị không thay đổi trong quá trình chạy chương trình. Cú pháp khai báo hằng số giống như khai báo biến, chỉ thay var bằng const, và hằng số phải được gán giá trị khi khai báo.

const pi = 3.1415
const e = 2.7182

Sau khi khai báo pie, giá trị của chúng không thể thay đổi trong suốt quá trình chạy chương trình.

Có thể khai báo nhiều hằng số cùng lúc:

const (
    pi = 3.1415
    e = 2.7182
)

Nếu bỏ qua giá trị khi khai báo nhiều hằng số, giá trị sẽ giống như hằng số phía trên. Ví dụ:

const (
    n1 = 100
    n2
    n3
)

Hằng số n1, n2, n3 đều có giá trị là 100.

iota

iota là bộ đếm hằng số trong Go, chỉ sử dụng được trong biểu thức hằng số.

iota được đặt lại thành 0 khi từ khóa const xuất hiện. Mỗi dòng khai báo hằng số mới sẽ tăng iota lên 1 (có thể hiểu iota là chỉ số dòng trong khối const). Sử dụng iota giúp đơn giản hóa việc định nghĩa, đặc biệt hữu ích khi định nghĩa enum.

Ví dụ:

const (
    n1 = iota //0
    n2        //1
    n3        //2
    n4        //3
)

Một số ví dụ về iota:

Sử dụng _ để bỏ qua một số giá trị:

const (
    n1 = iota //0
    n2        //1
    _
    n4        //3
)

iota giữa các khai báo:

const (
    n1 = iota //0
    n2 = 100  //100
    n3 = iota //2
    n4        //3
)
const n5 = iota //0

Định nghĩa cấp độ (sử dụng << để dịch trái):

const (
    _  = iota
    KB = 1 << (10 * iota)
    MB = 1 << (10 * iota)
    GB = 1 << (10 * iota)
    TB = 1 << (10 * iota)
    PB = 1 << (10 * iota)
)

Nhiều iota trong một dòng:

const (
    a, b = iota + 1, iota + 2 //1,2
    c, d                      //2,3
    e, f                      //3,4
)

Thẻ: Go variables constants identifiers keywords

Đăng vào ngày 31 tháng 5 lúc 03:15