Reflection trong Golang là gì

Reflection Trong Golang La Gi



Phản ánh trong Golang cho phép chương trình kiểm tra và sửa đổi cấu trúc, loại và giá trị dữ liệu trong thời gian chạy. Nó cung cấp một tập hợp các hàm cho phép chúng ta kiểm tra kiểu và giá trị của bất kỳ biến nào trong thời gian chạy, tạo các phiên bản kiểu mới và sửa đổi giá trị của các biến hiện có. Bài viết này đề cập đến các hàm Golang khác nhau trong gói phản ánh.

Mục lục

Go là một ngôn ngữ được nhập tĩnh, vì vậy loại biến phải được biết tại thời điểm biên dịch. Tuy nhiên, trong một số tình huống nhất định, có thể cần phải xử lý các giá trị có loại không thể xác định được cho đến khi chương trình được thực thi.







Ví dụ: chúng ta có thể cần viết một hàm có thể hoạt động với các loại đối số khác nhau hoặc chúng ta có thể cần tuần tự hóa và giải tuần tự hóa dữ liệu thuộc các loại không xác định. Đây là nơi gói phản ánh được sử dụng trong Golang.



Gói phản ánh trong Go

Gói phản ánh cung cấp một tập hợp các chức năng cho phép chúng tôi kiểm tra và thao tác các giá trị trong thời gian chạy, bất kể loại của chúng. Với các chức năng này, chúng ta có thể lấy thông tin về loại và giá trị của bất kỳ biến nào, tạo các thể hiện mới của loại và sửa đổi giá trị của các biến hiện có.



Gói phản ánh trong Golang chứa hai loại: Loại và Giá trị. Loại đại diện cho loại Đi, chẳng hạn như int, chuỗi hoặc cấu trúc tùy chỉnh. Giá trị đại diện cho giá trị của một loại cụ thể, chẳng hạn như 42 hoặc “xin chào”.





Gói phản ánh cũng cung cấp một tập hợp các hàm cho phép chúng ta lấy các đối tượng Loại và Giá trị từ các biến. Ví dụ: hàm phản xạ.TypeOf() trả về một đối tượng Loại đại diện cho loại biến, trong khi hàm phản xạ.ValueOf() trả về một đối tượng Giá trị hiển thị giá trị của biến.

Trong các phần tiếp theo, chúng ta sẽ tìm hiểu một số chức năng thường được sử dụng trong gói phản ánh.



hàm phản xạ.Copy()

Hàm phản xạ.Copy() của gói phản ánh được sử dụng để sao chép các giá trị của một lát sang một lát khác. Nó nhận hai tham số, dst và src, cả hai đều phải là các giá trị lát cắt có cùng loại phần tử. Hàm sao chép các giá trị từ lát cắt src vào lát cắt dst và trả về số phần tử đã được sao chép.

Hàm phản ánh.Copy() được thể hiện trong ví dụ sau:

bưu kiện chủ yếu

nhập khẩu (

'fmt'
'phản ánh'
)
chức năng chủ yếu () {
src := [] int { 1 , 2 , 3 , 4 , 5 }
dst := làm ([] int , chỉ một ( src ))
N := phản ánh . Sao chép ( phản ánh . Giá trị của ( dst ), phản ánh . Giá trị của ( src ))
fmt . Println ( N ) // Đầu ra: 5
fmt . Println ( dst ) // Đầu ra: [1 2 3 4 5]


}

Trong ví dụ này, chúng tôi tạo một lát cắt nguồn src với một số giá trị nguyên và một lát cắt đích dst có cùng độ dài với src. Sau đó, chúng tôi gọi phản xạ.Copy() để sao chép các giá trị từ src sang dst và in số phần tử đã được sao chép (n) và nội dung của lát cắt dst.

hàm phản ánh.DeepEqual()

Hàm phản xạ.DeepEqual() của gói phản ánh được sử dụng để so sánh hai giá trị cho bằng nhau. Hàm này có hai tham số đầu vào là a và b, cả hai tham số này có thể là bất kỳ giá trị nào thuộc bất kỳ loại nào. Hàm trả về true nếu a và b bằng nhau sâu sắc, nghĩa là các giá trị cơ bản của chúng bằng nhau theo cách đệ quy. Nếu không, nó hóa ra là sai.

Ví dụ sau đây cho thấy cách sử dụng phản ánh.DeepEqual():

bưu kiện chủ yếu

nhập khẩu (

'fmt'
'phản ánh'
)
chức năng chủ yếu () {
Một := [] int { 1 , 2 , 3 }
b := [] int { 1 , 2 , 3 }
nếu như phản ánh . DeepEqual ( Một , b ) {
fmt . Println ( 'a và b bằng nhau' )
} khác {
fmt . Println ( 'a và b không bằng nhau' )
}


}

Trong ví dụ này, chúng tôi tạo hai lát cắt a và b có cùng giá trị số nguyên. Sau đó, chúng tôi gọi phản ánh.DeepEqual() để so sánh a và b cho bằng nhau và in kết quả.

hàm phản xạ.Swapper()

Hàm phản xạ.Swapper() của gói phản ánh được sử dụng để trả về một hàm có thể hoán đổi các phần tử của một lát cắt. Nó nhận một tham số duy nhất, v, phải là một giá trị lát cắt. Hàm trả về một hàm nhận hai tham số nguyên là i và j và hoán đổi các phần tử của lát cắt tại các vị trí i và j.

Việc sử dụng phản ánh.Swapper() có thể được minh họa thông qua ví dụ sau:

bưu kiện chủ yếu

nhập khẩu (

'fmt'
'phản ánh'
)
chức năng chủ yếu () {
S := [] int { 1 , 2 , 3 , 4 , 5 }
tráo đổi := phản ánh . trao đổi ( S )
tráo đổi ( 1 , 3 )
fmt . Println ( S ) // Đầu ra: [1 4 3 2 5]


}

Trong ví dụ này, chúng tôi đã tạo một lát có tên s với một số giá trị nguyên. Sau đó, chúng tôi gọi phản xạ.Swapper() để nhận một hàm hoán đổi có thể hoán đổi các phần tử của lát cắt. Chúng tôi sử dụng hoán đổi để hoán đổi các phần tử ở vị trí 1 và 3 của lát cắt s và in kết quả.

hàm phản ánh.TypeOf()

Reflect.TypeOf() được sử dụng để lấy loại giá trị. Hàm này chấp nhận một tham số duy nhất “v” có thể thuộc bất kỳ loại hoặc giá trị nào. Hàm trả về giá trị phản ánh.Type đại diện cho loại giá trị.

Việc sử dụng phản ánh.TypeOf() có thể được minh họa thông qua ví dụ sau:

bưu kiện chủ yếu

nhập khẩu (

'fmt'
'phản ánh'
)
chức năng chủ yếu () {
đã từng là x phao64 = 3 . 14
t := phản ánh . Loại ( x )
fmt . Println ( t ) // Đầu ra: float64


}

Trong ví dụ này, chúng tôi tạo một biến float64 x với giá trị 3,14. Sau đó, chúng tôi gọi phản ánh.TypeOf() để lấy loại x và lưu trữ kết quả trong một biến phản ánh.Type t. Chúng tôi in giá trị của t, là float64.

hàm phản ánh.ValueOf()

phản ánh.ValueOf() có thể nhận được một phản ánh. Giá trị đại diện của một giá trị. Nó nhận một tham số duy nhất v, có thể là bất kỳ giá trị nào thuộc bất kỳ loại nào. Hàm trả về một giá trị phản ánh. Giá trị đại diện cho giá trị của tham số đầu vào.

Việc sử dụng phản ánh.ValueOf() có thể được minh họa thông qua ví dụ sau:

bưu kiện chủ yếu

nhập khẩu (

'fmt'
'phản ánh'
)
chức năng chủ yếu () {
đã từng là x phao64 = 3 . 14
TRONG := phản ánh . Giá trị của ( x )
fmt . Println ( TRONG ) // Đầu ra: 3.14

}

Trong ví dụ này, chúng tôi tạo một biến float64 x với giá trị 3,14. Sau đó, chúng tôi gọi phản ánh.ValueOf() để nhận biểu diễn giá trị phản ánh của x và lưu trữ kết quả trong một biến giá trị phản ánh v. Chúng tôi in giá trị của v, là 3,14.

Gói phản ánh cung cấp nhiều chức năng ngoài những chức năng được đề cập và đây chỉ là một vài ví dụ. Bằng cách sử dụng các chức năng được cung cấp bởi gói phản ánh, chúng ta có thể tạo mã có thể hoạt động với các giá trị thuộc bất kỳ loại nào mà không cần biết loại tại thời điểm biên dịch.

Phần kết luận

Phản ánh trong Golang cho phép chương trình kiểm tra và sửa đổi cấu trúc, loại và giá trị dữ liệu trong thời gian chạy. Nó được thực hiện thông qua gói phản ánh, cung cấp các chức năng để kiểm tra và thao tác các loại và giá trị. Sự phản chiếu đặc biệt hữu ích khi làm việc với các giao diện, các loại không xác định hoặc khi bạn cần triển khai các chức năng chung. Bài viết này đã thảo luận về những điều cơ bản của sự phản ánh trong Golang, bao gồm gói phản ánh, Loại và giá trị phản ánh cũng như loại và giá trị động.