Đâ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ố:
- Kiểu string
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ị true
và b đượ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 | 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 int và kiể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 | 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. |
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 a
và b
được suy ra từ giá trị được gán cho chúng. Trong trường hợp này biến a
và b
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 a
và b
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 no1 và no2. 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
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)
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 (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.
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 i và j 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.
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.
Bạn có thể vui lòng tắt trình chặn quảng cáo ❤️ để hỗ trợ chúng tôi duy trì hoạt động của trang web.
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.
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, ...
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 (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.