Trong Golang, cấu trúc (hoặc struct) cho phép chúng ta nhóm các phần tử của nhiều loại khác nhau thành một đơn vị duy nhất, hữu ích cho việc mô hình hóa thực thể trong thế giới thực. Cấu trúc ẩn danh trong Golang là cấu trúc tạm thời không có tên được sử dụng cho mục đích một lần, trong khi trường ẩn danh cho phép nhúng các trường không có tên.
Ví dụ:
package main
import "fmt"
// struct học sinh với cấu trúc và trường ẩn danh
type Student struct {
struct { // Cấu trúc bên trong ẩn danh cho thông tin cá nhân
name string
enrollment int
}
GPA float64 // Trường chuẩn
}
func main() {
student := Student{
struct {
name string
enrollment int
}{
name: "A",
enrollment: 12345,
},
GPA: 3.8,
}
fmt.Println("Name:", student.name)
fmt.Println("Enrollment:", student.enrollment)
fmt.Println("GPA:", student.GPA)
}
Cú pháp:
variable := struct {
field1 dataType1
field2 dataType2 # Cấu trúc ẩn danh
// Trường bổ sung khi cần
}{value1, value2}
type StructName struct {
dataType1
dataType2 # Trường ẩn danh
// Trường ẩn danh bổ sung
}
Cấu trúc ẩn danh trong Go
Cấu trúc ẩn danh trong Go được định nghĩa mà không có tên và hữu ích để tạo cấu trúc tạm thời, dùng một lần. Sau đây là cú pháp và ví dụ về code.
Cú pháp:
variable := struct {
field1 dataType1
field2 dataType2
// Các trường bổ sung khi cần
}{value1, value2}
Ví dụ:
package main
import "fmt"
// Cấu trúc sinh viên với cấu trúc bên trong ẩn danh cho thông tin cá nhân
type Student struct {
personalDetails struct { // Cấu trúc ẩn danh bên trong cho thông tin cá nhân
name string
enrollment int
}
GPA float64 // Trường chuẩn
}
func main() {
// Khởi tạo cấu trúc bên trong cho student
student := Student{
personalDetails: struct {
name string
enrollment int
}{
name: "A",
enrollment: 12345,
},
GPA: 3.8,
}
// Hiện giá trị
fmt.Println("Name:", student.personalDetails.name)
fmt.Println("Enrollment:", student.personalDetails.enrollment)
fmt.Println("GPA:", student.GPA)
}
Kết quả:
Name: A
Enrollment: 12345
GPA: 3.8
Code này định nghĩa một cấu trúc Student với một cấu trúc personalDetails ẩn danh bên trong, lưu trữ tên và thông tin đăng ký. Sau đó, khởi tạo student bằng các giá trị cho các trường này và in chúng ra.
Các trường ẩn danh
Các trường ẩn danh trong Go cho phép bạn định nghĩa các trường không có tên rõ ràng, chỉ xác định loại của chúng. Điều này có lợi khi các trường tự nhiên theo sau tên loại.
Cú pháp
type StructName struct {
dataType1
dataType2
// Additional anonymous fields
}
Ví dụ:
package main
import "fmt"
// Cấu trúc học sinh bằng các trường ẩn danh
type Student struct {
int // Số đăng ký (trường ẩn danh)
string // Tên trường ẩn danh
float64 // GPA (trường ẩn danh)
}
func main() {
// Khởi tạo struct học sinh với các trường ẩn danh
student := Student{12345, "A", 3.8}
// Hiện giá trị
fmt.Println("Enrollment:", student.int)
fmt.Println("Name:", student.string)
fmt.Println("GPA:", student.float64)
}
Kết quả:
Enrollment: 12345
Name: A
GPA: 3.8
Ở đây, các kiểu dữ liệu (int, string, float64) đóng vai trò là tên trường, do đó việc truy cập các giá trị phụ thuộc vào các kiểu.
Các điểm quan trọng cần ghi nhớ về Trường ẩn danh trong Golang
1. Yêu cầu duy nhất: Bạn không thể sử dụng hai trường cùng kiểu trong một cấu trúc. Ví dụ:
type InvalidStudent struct {
int
int // Error: duplicate type
}
2. Kết hợp các trường có tên và ẩn danh: Bạn có thể kết hợp các trường ẩn danh và có tên trong một cấu trúc.
type Student struct {
id int // Named field
int // Anonymous field
}