Kiểu dữ liệu trong Go

Đây hướng dẫn về kiểu dữ liệu trong loạt bài hướng dẫn lập trình Go của chúng tôi.

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.

Sau đây là các kiểu dữ liệu cơ bản có sẵn trong Go:

- Kiểu bool

- Kiểu số:

  • int8, int16, int32, int64, int
  • uint8, uint16, uint32, uint64, uint
  • float32, float64
  • complex64, complex128
  • byte
  • rune

- Kiểu string

Kiểu bool

Kiểu bool đại diện cho một boolean và có giá trị là true hoặc false.

package main

import "fmt"

func main() {  
    a := true
    b := false
    fmt.Println("a:", a, "b:", b)
    c := a && b
    fmt.Println("c:", c)
    d := a || b
    fmt.Println("d:", d)
}

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

Trong chương trình trên, biến a được gán một giá trị trueb được gán một giá trị false.

Biến c được gán giá trị của a && b. Toán tử && chỉ trả về true khi giá trị của cả a và b đều là true. Vì vậy, trong trường hợp này giá trị của biến c là false.

Toán tử || trả về true khi giá trị của một trong hai biến a hoặc b là true. Trong trường hợp này, biến d được gán giá trị true vì giá trị của biến a là true. Chúng ta sẽ nhận được kết quả sau cho chương trình này.

a: true b: false  
c: false  
d: true  

Kiểu số nguyên có dấu

Kiểu Kích thước Phạm vi giá trị Mô tả
int8 8 bit -128 - 127 Đại diện cho số nguyên có dấu
int16 16 bit -32768 - 32767 Đại diện cho số nguyên có dấu
int32 32 bit -2147483648 - 2147483647 Đại diện cho số nguyên có dấu
int64 64 bit -9223372036854775808 - 9223372036854775807 Đại diện cho số nguyên có dấu
int 32 bit (x86) và 64 bit (x64) -2147483648 đến 2147483647 (x86)
-9223372036854775808 đến 9223372036854775807 (x64)
Đại diện cho số nguyên 32 bit hoặc 64 bit tùy thuộc vào nền tảng bên dưới.
package main

import "fmt"

func main() {  
    var a int = 89
    b := 95
    fmt.Println("value of a is", a, "and b is", b)
}

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

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

value of a is 89 and b is 95

Trong chương trình trên, biến a có kiểu intkiểu b được suy ra từ giá trị được gán cho nó (95). Như chúng tôi đã nói ở trên, kích thước của kiểu int là 32 bit trong hệ thống 32 bit và 64 bit trong hệ thống 64 bit. Hãy tiếp tục và xác minh điều này.

Kiểu biến có thể được in bằng cách sử dụng định dạng %T trong function Printf. Go có một gói unsafe có function Sizeof trả về kích thước byte của biến được truyền vào nó.

Lưu ý: gói unsafe nên được sử dụng cẩn thận vì mã sử dụng nó có thể có vấn đề về tính di động, nhưng với mục đích của hướng dẫn này, chúng ta có thể sử dụng nó.

Chương trình sau đây xuất ra kiểu và kích thước của cả hai biến a và b. %T là tham số định dạng để in kiểu và %d được sử dụng để in kích thước.

package main

import (  
    "fmt"
    "unsafe"
)

func main() {  
    var a int = 89
    b := 95
    fmt.Println("value of a is", a, "and b is", b)
    fmt.Printf("type of a is %T, size of a is %d", a, unsafe.Sizeof(a)) //type and size of a
    fmt.Printf("\ntype of b is %T, size of b is %d", b, unsafe.Sizeof(b)) //type and size of b
}

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

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

value of a is 89 and b is 95  
type of a is int, size of a is 4  
type of b is int, size of b is 4  

Chúng ta có thể suy ra từ kết quả trên rằng cả hai biến a và b thuộc kiểu int và chúng có kích thước 32 bit (4 byte). Đầu ra sẽ thay đổi nếu bạn chạy chương trình trên trên hệ thống 64 bit. Trong hệ thống 64 bit, biến a và b có kích thước 64 bit (8 byte).

Kiểu số nguyên không dấu

Kiểu Kích thước Phạm vi giá trị Mô tả
uint8 8 bit 0 - 255 Đại diện cho số nguyên không dấu
uint16 16 bit 0 - 65535 Đại diện cho số nguyên không dấu
uint32 32 bit 0 - 4294967295 Đại diện cho số nguyên không dấu
uint64 64 bit 0 - 18446744073709551615 Đại diện cho số nguyên không dấu
uint 32 bit (x86) và 64 bit (x64) 0 đến 4294967295 (x86)
0 đến 18446744073709551615 (x64)
Đại diện cho số nguyên không dấu 32 bit hoặc 64 bit tùy thuộc vào nền tảng bên dưới.

Kiểu dấu chấm động

float32: Kiểu dấu chấm động 32 bit
float64: Kiểu dấu chấm động 64 bit

Sau đây là một chương trình đơn giản để minh họa các kiểu số nguyên và dấu chấm động

package main

import (  
    "fmt"
)

func main() {  
    a, b := 5.67, 8.97
    fmt.Printf("type of a %T b %T\n", a, b)
    sum := a + b
    diff := a - b
    fmt.Println("sum", sum, "diff", diff)

    no1, no2 := 56, 89
    fmt.Println("sum", no1+no2, "diff", no1-no2)
}

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

Kiểu của biến ab được suy ra từ giá trị được gán cho chúng. Trong trường hợp này biến ab thuộc kiểu float64 (float64 là kiểu mặc định cho các giá trị dấu chấm động).

Chúng ta cộng ab rồi gán giá trị của nó cho biến sum. Chúng ta trừ a cho b và gán nó cho biến diff. Tính toán tương tự cũng được thực hiện với hai biến no1no2. Chương trình trên sẽ in ra kết quả sau:

type of a float64 b float64  
sum 14.64 diff -3.3000000000000007  
sum 145 diff -33  

Kiểu số phức

complex64: kiểu số phức của float32 có phần số thực và ảo
complex128: kiểu số phức của float64 có phần số thực và ảo

Hàm complex được sử dụng để tạo một số phức với phần thực và phần ảo. Function complex có định nghĩa như sau:

func complex(r, i FloatType) ComplexType  

Nó lấy một phần thực và phần ảo làm tham số và trả về một kiểu ComplexType. Cả phần thực và phần ảo phải cùng kiểu dữ liệu. tức là float32 hoặc float64. Nếu cả phần thực và phần ảo đều là float32, thì function này trả về một giá trị số phức kiểu complex64. Nếu cả phần thực và phần ảo đều thuộc kiểu float64, thì function này trả về một giá trị số phức kiểu complex128.

Số phức cũng có thể được tạo bằng cú pháp viết tắt

c := 6 + 7i  

Hãy viết một chương trình nhỏ để hiểu số phức.

package main

import (  
    "fmt"
)

func main() {  
    c1 := complex(5, 7)
    c2 := 8 + 27i
    cadd := c1 + c2
    fmt.Println("sum:", cadd)
    cmul := c1 * c2
    fmt.Println("product:", cmul)
}

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

Trong chương trình trên, biến c1 và c2 là hai số phức. c1 có phần thực là 5 và phần ảo là 7. c2 có phần thực là 8 và phần ảo là 27. Biến cadd được gán tổng của c1 và c2 và biến cmul được gán tích của c1 và c2. Chương trình này sẽ in ra kết quả sau:

sum: (13+34i)  
product: (-149+191i)  

Các kiểu số khác

byte là bí danh của uint8
rune là bí danh của int32

Chúng ta sẽ thảo luận chi tiết hơn về byte và rune khi chúng ta tìm hiểu về kiểu string.

Kiểu string

Kiểu string (chuỗi) là một tập hợp các byte trong Go. Không sao cả nếu định nghĩa này không có ý nghĩa gì. Hiện tại, chúng ta có thể giả sử một chuỗi là một tập hợp các ký tự. Chúng ta sẽ tìm hiểu chi tiết về chuỗi trong một hướng dẫn chi tiết về chuỗi.

Hãy viết một chương trình bằng cách sử dụng kiểu string.

package main

import (  
    "fmt"
)

func main() {  
    first := "Trung"
    last := "Nguyen"
    name := first +" "+ last
    fmt.Println("My name is",name)
}

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

Trong chương trình trên, biến first được gán giá trị chuỗi "Trung", biến last được gán giá trị chuỗi "Nguyen". Các chuỗi có thể được nối bằng cách sử dụng toán tử +. Biến name được gán giá trị của biến first được nối với một khoảng trắng theo sau bởi biến last. Chương trình trên sẽ in ra kết quả sau.

My name is Trung Nguyen

Có một số thao tác khác có thể được thực hiện trên chuỗi. Chúng ta sẽ xem xét những điều đó trong một hướng dẫn chi tiết về chuỗi.

Chuyển đổi kiểu

Go rất nghiêm ngặt về việc định kiểu rõ ràng. Không có chuyển đổi kiểu tự động. Hãy xem điều này có nghĩa là gì với một ví dụ.

package main

import (  
    "fmt"
)

func main() {  
    i := 55      //int
    j := 67.8    //float64
    sum := i + j //int + float64 not allowed
    fmt.Println(sum)
}

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

Đoạn mã trên là hoàn toàn hợp pháp trong ngôn ngữ C. Nhưng trong trường hợp của Go, điều này sẽ không hoạt động. Biến i thuộc kiểu int và j thuộc kiểu float64. Chúng ta đang cố gắng cộng 2 số có kiểu khác nhau nhưng không được phép. Khi bạn chạy chương trình, bạn sẽ nhận được thông báo lỗi ./prog.go:10:11: invalid operation: i + j (mismatched types int and float64)

Để sửa lỗi, cả hai biến ij phải cùng kiểu. Hãy chuyển đổi biến j thành int. T (v) là cú pháp để chuyển đổi giá trị biến v thành kiểu T

package main

import (  
    "fmt"
)

func main() {  
    i := 55      //int
    j := 67.8    //float64
    sum := i + int(j) //j is converted to int
    fmt.Println(sum)
}

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

Bây giờ khi bạn chạy chương trình trên, bạn có thể thấy kết quả 122 ở đầu ra.

Điều này cũng xảy ra với trường hợp gán giá trị cho biến. Chuyển đổi kiểu rõ ràng là bắt buộc để gán một biến kiểu này cho biến kiểu khác. Điều này được giải thích trong chương trình sau đây.

package main

import (  
    "fmt"
)

func main() {  
    i := 10
    var j float64 = float64(i) //this statement will not work without explicit conversion
    fmt.Println("j", j)
}

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

Tại dòng số 9, biến i được chuyển đổi thành float64 và sau đó được gán cho biến j. Khi bạn cố gắng gán giá trị của biên i cho biến j mà không có bất kỳ chuyển đổi kiểu nào, trình biên dịch sẽ báo lỗi.

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

Hằng số trong Go
Trong hướng dẫn này, chúng ta sẽ tìm hiểu về hằng số là gì, cách khai báo hằng số, hằng số chuỗi, hằng số boolean, ... trong Go.

Cảm ơn bạn đã đọ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.