[Golang cơ bản] Constant trong Golang

Post on: 2023-03-30 23:48:23 | in: Golang
Constant trong Golang là các giá trị không thay đổi trong suốt vòng đời của chương trình. Chúng được định nghĩa bằng từ khóa const.

Tổng quan

Một hằng số là bất cứ thứ gì không thay đổi giá trị của nó. Trong Go, const có thể là kiểu string, số, boolean và ký tự.

Một hằng số có thể được khai báo bằng từ khóa const. Một điểm quan trọng cần lưu ý là giá trị phải được gán khi khai báo một hằng số. Điều này khác với biến, nơi giá trị có thể được gán sau.

  • Khai báo một const cùng với việc chỉ định kiểu - Nó bắt đầu bằng từ khóa const, tiếp theo là tên và sau đó là kiểu. Giá trị cũng phải được gán ngay lập tức như đã thảo luận ở trên.
const c string = "circle"
  • Khai báo một const mà không chỉ định kiểu - Một const được khai báo mà không có kiểu được gọi là hằng số không có kiểu. Chúng ta sẽ tìm hiểu thêm về hằng số có kiểu và không có kiểu sau này. Hiện tại, điều quan trọng là biết rằng const được khai báo mà không có kiểu sẽ có một kiểu ẩn mặc định. Hằng số sẽ được gán một kiểu khi nó được gán cho một biến bất kỳ (khởi tạo trực tiếp, truyền vào một hàm v.v.).
const c = "circle"
  • Khai báo nhiều const cùng nhau.
const (
  c = "circle"
  s = "square"
)

Những điểm quan trọng

  • Hằng số không thể được gán lại giá trị sau khi đã được khai báo. Ví dụ, đoạn mã dưới đây sẽ gây ra lỗi biên dịch.
package main
func main() {
    const a int = 8
    a = 9
}

Error:

main.go:5:4: cannot assign to a
  • Giá trị của hằng số phải được biết tại thời điểm biên dịch. Do đó, một giá trị hằng số không thể được gán cho một lời gọi hàm được đánh giá tại thời điểm chạy. Ví dụ, trong chương trình dưới đây, a là một hằng số và giá trị của nó phải có sẵn tại thời điểm biên dịch, nhưng hàm getValue sẽ chỉ được gọi tại thời điểm chạy, do đó nó sẽ gây ra lỗi trong quá trình biên dịch.

package main
const name = "test"
func main() {
    const a = getValue()
}
func getValue() int {
    return 1
}

Error:

const initializer getValue() is not a constant
  • Một hằng số được khai báo trong một phạm vi nội bộ có cùng tên với hằng số được khai báo trong phạm vi bên ngoài sẽ che khuất hằng số ở phạm vi bên ngoài.

package main
import "fmt"
const a = 123
func main() {
    const a = 456
    fmt.Println(a)
}

Output:

456

Hằng số có kiểu và không có kiểu

Bây giờ chúng ta đến đến một chủ đề rất quan trọng. Trong Go, hằng số được xử lý khác với bất kỳ ngôn ngữ lập trình nào khác. Go có một hệ thống kiểu rất mạnh mẽ không cho phép chuyển đổi ngầm định giữa bất kỳ kiểu dữ liệu nào. Ngay cả với các kiểu số giống nhau, không có hoạt động nào được phép thực hiện mà không cần chuyển đổi rõ ràng. Ví dụ, bạn không thể cộng giá trị của int32 và int64. Để thực hiện phép cộng này, int32 phải được chuyển đổi rõ ràng thành int64 hoặc ngược lại. Tuy nhiên, hằng số không có kiểu có tính linh hoạt và có thể tạm thời thoát khỏi hệ thống kiểu của Go, như chúng ta sẽ thấy trong bài viết này.

Hằng số có kiểu

Một hằng số được khai báo với kiểu dữ liệu trong khai báo được gọi là hằng số có kiểu. Ví dụ dưới đây là khai báo một hằng số kiểu int32.

const a int32 = 8

Hằng số a chỉ có thể được gán cho một biến có kiểu int32. Nếu nó được gán cho một biến của bất kỳ kiểu nào khác, nó sẽ gây ra lỗi. Để minh họa, hãy xem chương trình dưới đây.

package main

func main() {
    const a int32 = 8

    var i1 int32
    var i2 int64

    i1 = a
    i2 = a
}

Output:

cannot use a (type int32) as type int64 in assignment

Hằng số không có kiểu

Hằng số không có kiểu là hằng số mà không có kiểu dữ liệu được chỉ định. Một hằng số không có kiểu trong GO có thể là đặt tên hoặc không đặt tên. Trong cả hai trường hợp, nó không có bất kỳ kiểu dữ liệu nào được liên kết với nó.

Ví dụ về hằng số không đặt tên và không có kiểu dữ liệu được chỉ định.

123        //Default hidden type is int
"circle"   //Default hidden type is string
5.6.       //Default hidden type is float64
true       //Default hidden type is bool
'a'        //Default hidden type is rune
3+5i       //Default hidden type is complex128

Ví dụ về hằng số không có kiểu dữ liệu được chỉ định và có tên

const a = 123        //Default hidden type is int
const b = "circle"   //Default hidden type is string
const c = 5.6       //Default hidden type is float64
const d = true       //Default hidden type is bool
const e = 'a'        //Default hidden type is rune
const f = 3+5i       //Default hidden type is complex128

Giá trị không được nhập kiểu cũng có một loại dữ liệu ẩn mặc định. Ví dụ, bảng dưới đây cho thấy các loại dữ liệu ẩn mặc định cho các giá trị số, chuỗi, ký tự và boolean

Loại dữ liệu ẩn mặc định cho hằng số

Integers int
Floats float64
Complex Numbers complex128
Strings string
Booleans bool
Characters int32 or rune

Khi bạn in bất kỳ hằng số không được nhập kiểu nào bằng cách sử dụng fmt.Printf, nó sẽ in ra loại dữ liệu ẩn mặc định. Xem chương trình và đầu ra dưới đây cho cả hằng số không đặt tên và có đặt tên.

package main

import "fmt"

func main() {
    //Unanamed untyped constant
    fmt.Printf("Type: %T Value: %v\n", 123, 123)
    fmt.Printf("Type: %T Value: %v\n", "circle", "circle")
    fmt.Printf("Type: %T Value: %v\n", 5.6, 5.6)
    fmt.Printf("Type: %T Value: %v\n", true, true)
    fmt.Printf("Type: %T Value: %v\n", 'a', 'a')
    fmt.Printf("Type: %T Value: %v\n", 3+5i, 3+5i)

    //Named untyped constant
    const a = 123      //Default hidden type is int
    const b = "circle" //Default hidden type is string
    const c = 5.6      //Default hidden type is float64
    const d = true     //Default hidden type is bool
    const e = 'a'      //Default hidden type is rune
    const f = 3 + 5i   //Default hidden type is complex128

    fmt.Println("")
    fmt.Printf("Type: %T Value: %v\n", a, a)
    fmt.Printf("Type: %T Value: %v\n", b, b)
    fmt.Printf("Type: %T Value: %v\n", c, c)
    fmt.Printf("Type: %T Value: %v\n", d, d)
    fmt.Printf("Type: %T Value: %v\n", e, e)
    fmt.Printf("Type: %T Value: %v\n", f, f)
}

Output:

Type: int Value: 123
Type: string Value: circle
Type: float64 Value: 5.6
Type: bool Value: true
Type: int32 Value: 97
Type: complex128 Value: (3+5i)

Type: int Value: 123
Type: string Value: circle
Type: float64 Value: 5.6
Type: bool Value: true
Type: int32 Value: 97
Type: complex128 Value: (3+5i)

Chương trình trên in ra int32 thay vì rune vì rune là một bí danh cho int32.

Loại dữ liệu mặc định của một hằng số có tên hoặc không có tên sẽ trở thành loại của một biến mà nó được gán cho. Ví dụ trong đoạn mã dưới đây, biến a sẽ nhận loại của hằng số không tên 123, mặc định là int.

var a = 123

Hãy xem một chương trình minh họa cho các điểm trên đối với tất cả các hằng số không có tên

package main
import "fmt"
func main() {
    //Untyped
    var u = 123      //Default hidden type is int
    var v = "circle" //Default hidden type is string
    var w = 5.6      //Default hidden type is float64
    var x = true     //Default hidden type is bool
    var y = 'a'      //Default hidden type is rune
    var z = 3 + 5i   //Default hidden type is complex128
    fmt.Printf("Type: %T Value: %v\n", u, u)
    fmt.Printf("Type: %T Value: %v\n", v, v)
    fmt.Printf("Type: %T Value: %v\n", w, w)
    fmt.Printf("Type: %T Value: %v\n", x, x)
    fmt.Printf("Type: %T Value: %v\n", y, y)
    fmt.Printf("Type: %T Value: %v\n", z, z)
}

Output

Type: int Value: 123
Type: string Value: circle
Type: float64 Value: 5.6
Type: bool Value: true
Type: int32 Value: 97
Type: complex128 Value: (3+5i)

Câu hỏi đặt ra là tại sao chúng ta cần sử dụng hằng số không được nhập kiểu. Việc sử dụng hằng số không được nhập kiểu là để loại của hằng số sẽ được xác định dựa trên loại của biến mà nó được gán cho. Có vẻ khó hiểu? Hãy xem ví dụ sau.

Giá trị hằng số Pi trong gói math được khai báo như sau

const Pi = 3.14159265358979323846264338327950288419716939937510582097494459

Lưu ý rằng loại dữ liệu không được chỉ định, nó chỉ có loại dữ liệu ẩn mặc định (trong trường hợp này là float64). Hãy xem một đoạn mã ví dụ để hiểu rõ hơn.

package main
import (
    "fmt"
    "math"
)
func main() {
    var f1 float32
    var f2 float64
    f1 = math.Pi
    f2 = math.Pi

    fmt.Printf("Type: %T Value: %v\n", math.Pi, math.Pi)
    fmt.Printf("Type: %T Value: %v\n", f1, f1)
    fmt.Printf("Type: %T Value: %v\n", f2, f2)
}

Output

Type: float64 Value: 3.141592653589793
Type: float32 Value: 3.1415927
Type: float64 Value: 3.141592653589793

Chú ý đến chương trình ở trên.

  • Do tính không được nhập kiểu của hằng số math.Pi, nó có thể được gán cho một biến có kiểu float32 hoặc float64. Điều này không thể xảy ra trong GO sau khi loại đã được xác định. Khi chúng ta in ra loại của math.Pi, nó in ra loại dữ liệu mặc định là float64.

  • Tùy thuộc vào trường hợp sử dụng, một hằng số không được nhập kiểu có thể được gán cho một kiểu độ chính xác thấp (float32) hoặc một kiểu độ chính xác cao (float64).

Tùy thuộc vào trường hợp sử dụng, một hằng số không kiểu có thể được gán cho một loại dữ liệu có độ chính xác thấp (float32) hoặc cao (float64).

Quy ước đặt tên

Quy ước đặt tên cho hằng số giống như quy ước đặt tên cho biến.

  • Một tên hằng số chỉ có thể bắt đầu bằng một chữ cái hoặc một dấu gạch dưới. Sau đó, nó có thể được theo sau bởi bất kỳ số lượng chữ cái, số hoặc dấu gạch dưới nào.

Hằng số toàn cục

Tương tự như bất kỳ biến nào khác, một hằng số sẽ là toàn cục trong một gói nếu nó được khai báo ở đầu tệp bên ngoài phạm vi của bất kỳ hàm nào. Ví dụ, trong chương trình dưới đây, tên sẽ là một hằng số toàn cục có sẵn trong toàn bộ gói chính trong bất kỳ hàm nào. Lưu ý rằng hằng số tên sẽ không có sẵn bên ngoài gói chính. Để có thể sử dụng nó bên ngoài gói chính, nó phải bắt đầu bằng một chữ cái viết hoa.

Xem mã dưới đây. Nó cũng cho thấy ví dụ về một hằng số cục bộ trong một gói.

package main

import "fmt"

const name = "test"

func main() {
    const a = 8
    fmt.Println(a)
    testGlobal()
}

func testGlobal() {
    fmt.Println(name)
    //The below line will give compiler error as a is a local constant
    //fmt.Println(a)

Các loại hằng số

Hằng số có thể thuộc bốn loại:

  • Hằng số số (Numeric constants)

  • Hằng số chuỗi (String constants)

  • Hằng số ký tự (Character constants)

  • Hằng số boolean (Boolean constants)

Hằng số chuỗi

Trong Go, hằng số chuỗi được biểu diễn bằng hai cách

  • Bất kỳ giá trị nào được bao quanh bởi dấu ngoặc kép ("...")

  • Bất kỳ giá trị nào được bao quanh bởi dấu ngoặc ngược (...)

Chương trình dưới đây cho thấy một ví dụ về:

  • Hằng số chuỗi được gán kiểu (Typed string constant)

  • Hằng số chuỗi không tên được gán kiểu không tên (Untyped unnamed string constant)

  • Hằng số chuỗi có tên không kiểu (Untyped named string constant)

package main

import "fmt"

func main() {
type myString string

//Typed String constant
const aa string = "abc"
var uu = aa
fmt.Println("Untyped named string constant")
fmt.Printf("uu: Type: %T Value: %v\n\nn", uu, uu)

//Below line will raise a compilation error
//var v myString = aa

//Untyped named string constant
const bb = "abc"
var ww myString = bb
var xx = bb
fmt.Println("Untyped named string constant")
fmt.Printf("ww: Type: %T Value: %v\n", ww, ww)
fmt.Printf("xx: Type: %T Value: %v\n\n", xx, xx)

//Untyped unnamed string constant
var yy myString = "abc"
var zz = "abc"
fmt.Println("Untyped unnamed string constant")
fmt.Printf("yy: Type: %T Value: %v\n", yy, yy)
fmt.Printf("zz: Type: %T Value: %v\n", zz, zz)

}

Output:

Untyped named string constant
uu: Type: string Value: abc

nUntyped named string constant
ww: Type: main.myString Value: abc
xx: Type: string Value: abc

Untyped unnamed string constant
yy: Type: main.myString Value: abc
zz: Type: string Value: abc

Trong chương trình trên, chúng ta đã tạo ra một kiểu mới là myString trong mã.

type myString string

Chương trình trên cũng cho thấy ví dụ về:

  • Hằng số chuỗi được gán kiểu (Typed string constant)
  • Hằng số chuỗi không tên được gán kiểu không tên (Untyped unnamed string constant)
  • Hằng số chuỗi có tên không kiểu (Untyped named string constant)

Hãy hiểu rõ hơn về từng loại hằng số và cách chúng hoạt động:

Hằng số chuỗi được gán kiểu

Nó được định nghĩa như sau

const aa string = "abc"

Thông báo trên cho biết rằng dòng bên dưới sẽ gây ra lỗi biên dịch. Điều này là do hằng số chuỗi đã được định kiểu aa là kiểu string. Vì vậy, dòng bên dưới sẽ gây ra lỗi biên dịch vì nó không thể được gán cho biến có kiểu myString.

var v myString = aa

Tuy nhiên, hằng số chuỗi đã được định kiểu có thể được gán cho một biến được tạo ra với từ khóa var như sau:

var uu = aa

Hằng số chuỗi không có kiểu được đặt tên

Nó được định nghĩa như sau

const bb = "abc"

Hằng số chuỗi không có kiểu được đặt tên có thể được gán cho biến có kiểu myString cũng như biến được tạo ra với từ khóa var, vì nó không có kiểu nên kiểu của hằng số sẽ được quyết định dựa trên kiểu của biến mà chúng được gán vào.

var ww myString = bb
var xx = bb

Hằng số chuỗi không định kiểu và không có tên

Nó được định nghĩa như sau

abc

Hằng số chuỗi không được đánh dấu kiểu có thể được gán cho biến có kiểu myString cũng như biến được tạo bằng từ khóa var vì nó không được đánh dấu kiểu, do đó kiểu của hằng số sẽ được xác định tùy thuộc vào kiểu của biến mà chúng được gán vào.

var yy myString = "abc"
var zz = "abc"

Hằng số số

Hằng số số được chia thành ba loại

  • Số nguyên
  • Số thực
  • Số phức

Một hằng số số nguyên không được đánh dấu kiểu (bao gồm cả các hằng số tên và không tên) có thể được gán cho các kiểu int, float và complex. Điều này bởi vì một giá trị int có thể là int hoặc float hoặc complex. Ví dụ, giá trị int 123 có thể là:

  • Một số nguyên có giá trị là 123
  • Một số thực có giá trị là 123.0
  • Một số phức có phần ảo bằng 0

Dựa trên cùng một logic tương tự, một hằng số số thực không có kiểu có thể được gán cho tất cả các kiểu float và complex, nhưng không phải kiểu integer vì ví dụ một số thực 5.3 không thể là một số nguyên.

Tương tự, một hằng số số phức không được đánh dấu kiểu có thể được gán cho các kiểu số phức nhưng không thể được gán cho kiểu số nguyên hoặc số thực vì ví dụ một số phức 5i + 3 không thể là số nguyên hoặc số thực.

Xem chương trình dưới đây minh họa cho các điểm trên. Trong chương trình, chúng ta có ví dụ cho:

  • Hằng số nguyên được đánh dấu kiểu

  • Hằng số nguyên không được đánh dấu kiểu không tên

  • Hằng số nguyên không được đánh dấu kiểu có tên.

package main

import "fmt"

func main() {
//Typed int constant
const aa int = 123
var uu = aa
fmt.Println("Typed named integer constant")
fmt.Printf("uu: Type: %T Value: %v\n\n", uu, uu)

//Below line will raise a compilation error
//var v int32 = aa

//Untyped named int constant
const bb = 123
var ww = bb
var xx int32 = bb
var yy float64 = bb
var zz complex128 = bb
fmt.Println("Untyped named integer constant")
fmt.Printf("ww: Type: %T Value: %v\n", ww, ww)
fmt.Printf("xx: Type: %T Value: %v\n", xx, xx)
fmt.Printf("yy: Type: %T Value: %v\n", yy, yy)
fmt.Printf("zz: Type: %T Value: %v\n\n", zz, zz)

//Untyped unnamed int constant
var ll = 123
var mm int32 = 123
var nn float64 = 123
var oo complex128 = 123
fmt.Println("Untyped unnamed integer constant")
fmt.Printf("ll: Type: %T Value: %v\n", ll, ll)
fmt.Printf("mm: Type: %T Value: %v\n", mm, mm)
fmt.Printf("nn: Type: %T Value: %v\n", nn, nn)
fmt.Printf("oo: Type: %T Value: %v\n", oo, oo)
}

Output

Typed named integer constant
uu: Type: int Value: 123

Untyped named integer constant
ww: Type: int Value: 123
xx: Type: int32 Value: 123
yy: Type: float64 Value: 123
zz: Type: complex128 Value: (123+0i)

Untyped unnamed integer constant
ll: Type: int Value: 123
mm: Type: int32 Value: 123
nn: Type: float64 Value: 123
oo: Type: complex128 Value: (123+0i)

Chương trình ở trên đang cho thấy ví dụ về một

  • Hằng số nguyên có kiểu dữ liệu đã định nghĩa (Typed integer constant)
  • Hằng số nguyên không có kiểu dữ liệu và không có tên (Untyped unnamed integer constant)
  • Hằng số nguyên không có kiểu dữ liệu nhưng có tên (Untyped named integer constant)

Hãy hiểu rõ hơn về từng loại hằng số này và cách hoạt động của chúng.

Hằng số nguyên có kiểu dữ liệu đã định nghĩa

Nó được định nghĩa như sau

const aa int = 123

Hằng số nguyên có kiểu dữ liệu đã định nghĩa có thể được gán cho một biến được tạo ra bằng từ khóa "var" như sau:

var uu = aa

Nếu hằng số nguyên có kiểu dữ liệu đã định nghĩa được gán cho một biến khác có kiểu dữ liệu "int", sẽ xảy ra lỗi biên dịch. Do đó, ví dụ dưới đây sẽ gây ra lỗi biên dịch vì biến "aa" đã được định nghĩa với kiểu dữ liệu "int"

var v int32 = aa

Hằng số nguyên không có kiểu dữ liệu nhưng có tên

Nó được định nghĩa như sau

const bb = 123

Hằng số nguyên không có kiểu dữ liệu nhưng có tên có thể được gán cho bất kỳ kiểu dữ liệu "int", "float" hoặc "complex" nào và cũng có thể được gán cho bất kỳ biến nào được tạo ra bằng từ khóa "var". Do đó, ví dụ dưới đây hoạt động:

var ww = bb
var xx int32 = bb
var yy float64 = bb
var zz complex128 = bb

Hằng số nguyên không có kiểu dữ liệu và không có tên

Nó được định nghĩa như sau

123

Hằng số nguyên không có kiểu dữ liệu nhưng có tên có thể được gán cho bất kỳ kiểu dữ liệu "int", "float" hoặc "complex" nào và cũng có thể được gán cho bất kỳ biến nào được tạo ra bằng từ khóa "var". Do đó, ví dụ dưới đây hoạt động:

var ww = 123
var xx int32 = 123
var yy float64 = 123
var zz complex128 = 123

Biểu thức số học

Do tính không có kiểu dữ liệu của hằng số số, các loại hằng số số khác nhau có thể được kết hợp với nhau để tạo thành một biểu thức.

package main
import "fmt"
func main() {
    var p = 5.2 / 3
    fmt.Printf("p: Type: %T Value: %v\n", p, p)
}

Output:

p: Type: float64 Value: 1.7333333333333334

Hằng số boolean

Có hai hằng số boolean không được gõ chữ true và false. Dưới đây là chương trình minh họa cho một hằng số boolean.

package main

import "fmt"

func main() {
type myBool bool

//Typed Boolean constant
const aa bool = true
var uu = aa
fmt.Println("Typed named boolean constant")
fmt.Printf("uu: Type: %T Value: %v\n\n", uu, uu)

//Below line will raise a compilation error
//var vv myBool = aa

//Untyped named boolean constant
const bb = true

var ww myBool = bb
var xx = bb
fmt.Println("Untyped named boolean constant")
fmt.Printf("ww: Type: %T Value: %v\n", ww, ww)
fmt.Printf("xx: Type: %T Value: %v\n\n", xx, xx)

//Untyped unnamed boolean constant
var yy myBool = true
var zz = true
fmt.Println("Untyped unnamed boolean constant")
fmt.Printf("yy: Type: %T Value: %v\n", yy, yy)
fmt.Printf("zz: Type: %T Value: %v\n", zz, zz)
}

Output:

Typed named boolean constant
uu: Type: bool Value: true

Untyped named boolean constant
ww: Type: main.myBool Value: true
xx: Type: bool Value: true

Untyped unnamed boolean constant
yy: Type: main.myBool Value: true
zz: Type: bool Value: true

Trong chương trình trên, chúng ta đã tạo ra một kiểu mới có tên là myBool.

type myBool bool

Chương trình trên cũng cho thấy ví dụ về

  • Hằng số boolean được gán kiểu dữ liệu (Typed boolean constant)
  • Hằng số boolean không được đặt tên (Unnamed untyped boolean constant)
  • Hằng số boolean được đặt tên (Named untyped boolean constant)

Hãy hiểu rõ mỗi loại và hành vi của chúng.

Hằng số boolean được gán kiểu dữ liệu

Nó được định nghĩa như sau

const aa bool = true

Thông báo ở trên cho biết dòng dưới đây sẽ gây ra lỗi biên dịch. Điều này là do biến "aa" có kiểu là hằng số boolean. Vì vậy, dòng dưới đây sẽ gây ra lỗi biên dịch vì nó không thể được gán cho biến kiểu "myBool".

var v mybool = aa

Nhưng hằng chuỗi có kiểu có thể được gán cho một biến được tạo bằng từ khóa "var" như sau

var uu = aa

Hằng số boolean không có kiểu được đặt tên

Nó được định nghĩa như sau

const bb = true

Hằng chuỗi không có kiểu được đặt tên có thể được gán cho biến có kiểu "myBool" và cũng có thể được gán cho biến được tạo bằng từ khóa "var", vì nó không có kiểu nên kiểu của hằng số sẽ được xác định tùy thuộc vào kiểu của biến mà nó được gán cho.

var ww mybool = bb
var xx = bb

Hằng số boolean không có kiểu không được đặt tên

Nó giống như dưới đây

true

Hằng chuỗi không có kiểu không được đặt tên có thể được gán cho biến có kiểu "myBool" và cũng có thể được gán cho biến được tạo bằng từ khóa "var", vì nó không có kiểu nên kiểu của hằng số sẽ được xác định tùy thuộc vào kiểu của biến mà nó được gán cho.

var yy mybool = true
var zz = true

Hằng ký tự (character constant)

Dưới đây là chương trình minh họa cho hằng ký tự (character constant).

package main

import "fmt"

func main() {
type myChar int32

//Typed character constant
const aa int32 = 'a'
var uu = aa
fmt.Println("Untyped unnamed character constant")
fmt.Printf("uu: Type: %T Value: %v\n\n", uu, uu)

//Below line will raise a compilation error
//var vv myBool = aa

//Untyped named character constant
const bb = 'a'

var ww myChar = bb
var xx = bb
fmt.Println("Untyped named character constant")
fmt.Printf("ww: Type: %T Value: %v\n", ww, ww)
fmt.Printf("xx: Type: %T Value: %v\n\n", xx, xx)

//Untyped unnamed character constant
var yy myChar = 'a'
var zz = 'a'
fmt.Println("Untyped unnamed character constant")
fmt.Printf("yy: Type: %T Value: %v\n", yy, yy)
fmt.Printf("zz: Type: %T Value: %v\n", zz, zz)
}

Output:

Untyped unnamed character constant
uu: Type: int32 Value: 97

Untyped named character constant
ww: Type: main.myChar Value: 97
xx: Type: int32 Value: 97

Untyped unnamed character constant
yy: Type: main.myChar Value: 97
zz: Type: int32 Value: 97

Trong chương trình trên, chúng tôi đã tạo một loại mới myChar

type myChar int32

Chương trình trên cũng cho thấy ví dụ về

  • Hằng ký tự đã được định kiểu
  • Hằng ký tự không định kiểu và không có tên
  • Hằng ký tự không định kiểu và đã được đặt tên

Hãy hiểu rõ từng loại và hành vi của chúng.

Hằng ký tự đã được định kiểu

Nó được định nghĩa như sau

const aa int32 = 'a'

Chú ý rằng dòng bên dưới sẽ gây ra lỗi biên dịch. Điều này là do biến aa có kiểu int32. Do đó, dòng bên dưới sẽ gây ra lỗi biên dịch vì nó không thể được gán cho biến có kiểu myChar.

var v myChar = aa

Tuy nhiên, hằng số ký tự đã được định kiểu có thể được gán cho biến được tạo ra với từ khóa var như sau

var uu = aa

Hằng số ký tự không định kiểu được đặt tên

Nó được định nghĩa như sau

const bb = 'a'

Hằng số chuỗi không định kiểu được đặt tên có thể được gán cho biến có kiểu myChar cũng như biến được tạo ra với từ khóa var, vì nó không định kiểu nên kiểu của hằng số sẽ được quyết định dựa trên kiểu của biến mà chúng được gán vào.

var ww myChar = bb
var xx = bb

Hằng số ký tự không định kiểu và không có tên

Nó giống như

'a'

Hằng số chuỗi không định kiểu và không có tên có thể được gán cho biến có kiểu myChar cũng như biến được tạo ra với từ khóa var, vì nó không định kiểu nên kiểu của hằng số sẽ được quyết định dựa trên kiểu của biến mà chúng được gán vào.

var yy myChar = 'a'
var zz = 'a'

Tổng kết

Đây là tất cả về từ khóa const trong Golang. Hy vọng bạn đã thích bài viết này. Đừng chia sẻ thông tin phản hồi trong comments.

 
Tag: golang cơ bản go