Ví dụ về Golang Generics

Vi Du Ve Golang Generics



Tính năng chung của Golang cho phép tạo mã có thể tái sử dụng, an toàn về loại và tương thích với nhiều loại. May mắn thay, việc bổ sung các khái quát cho Go mở ra những con đường mới để sử dụng lại mã và tính linh hoạt. Phiên bản mới nhất của Golang mang đến sự hỗ trợ rất được mong đợi cho thuốc generic.

Quan trọng hơn, thuốc generic duy trì tính an toàn kiểu mạnh mẽ của Go, cho phép kiểm tra kiểu tĩnh tại thời điểm biên dịch và đảm bảo tính chính xác của kiểu. Chúng cung cấp cách xử lý lỗi được tiêu chuẩn hóa trong mã chung giúp cải thiện tính rõ ràng và khả năng bảo trì. Ngoài ra, chúng cung cấp cách xử lý lỗi được tiêu chuẩn hóa trong mã chung giúp cải thiện tính rõ ràng và khả năng bảo trì. Trong bài đăng này, chúng ta sẽ xem xét một số ứng dụng và ví dụ chung về Go trong thế giới thực.

Ví dụ 1: Sử dụng Golang Generic Function

Một trong những trường hợp sử dụng chính cho thuốc generic là tạo các hàm có thể hoạt động trên các loại khác nhau. Ở đây, chúng ta đi với một trong những ví dụ sử dụng hàm chu vi chung.







bưu kiện chủ yếu
nhập khẩu 'fmt'
chức năng đường tròn [ r int | phao32 ]( bán kính r ) {
c := 3 * 2 * bán kính
fmt . Println ( 'Chu vi chung là: ' , c )
}
chức năng chủ yếu () {
đã từng là r1 int = 7
đã từng là r2 phao32 = 7 . 5
đường tròn ( r1 )
đường tròn ( r2 )
}

Ở phần đầu của đoạn mã trước, dòng này nhập gói “fmt” cung cấp các chức năng cho I/O được định dạng, bao gồm cả việc in đầu ra ra bàn điều khiển. Sau đó, chúng tôi xác định một hàm chung có tên là 'chu vi' nhận tham số bán kính của loại chung 'r', có thể là 'int' hoặc 'float32'. Bên trong hàm, nó tính toán chu vi bằng cách nhân bán kính với giá trị không đổi của “3” và sau đó nhân với “2”. Cuối cùng, nó in chu vi tính được bằng cách sử dụng “fmt.Println”.



Tiếp theo, chúng ta có hàm main với hai biến r1 và r2 được khai báo và gán giá trị lần lượt là 7 và 7,5. Sau đó, hàm 'chu vi' được gọi hai lần, truyền r1 và r2 làm đối số.



Đầu ra hiển thị phép tính bằng cách in các chu vi của các vòng tròn như sau:





Ví dụ 2:  Sử dụng Giao diện chung của Golang

Hơn nữa, các công cụ chung của Golang hỗ trợ chúng tôi với giao diện của chúng. Các giao diện trong Go là một công cụ quan trọng để tạo điều kiện thuận lợi cho việc sử dụng lại mã và tính đa hình. Bằng cách cho phép chúng hoạt động với nhiều loại, thuốc generic tăng sức mạnh của giao diện. Sau đây là mã nguồn của giao diện Golang generics:



bưu kiện chủ yếu
nhập khẩu 'fmt'
kiểu EmpAge giao diện {
int64 | int32 | phao32 | phao64
}
chức năng newGenericFunc [ tuổi Tuổi ]( emp_Tuổi ) {
val := int ( emp_Tuổi ) + 1
fmt . Println ( val )
}
chức năng chủ yếu () {
fmt . Println ( 'Tuổi nhân viên' )
đã từng là Tuổi1 int64 = 24
đã từng là Tuổi2 phao64 = 25 . 5
    newGenericFunc ( Tuổi1 )
    newGenericFunc ( Tuổi2 )
}

Trong mã nguồn trước, chúng tôi đã xác định một giao diện có tên là “EmpAge” chỉ định các loại có thể có cho tuổi của nhân viên. Giao diện bao gồm các kiểu int64, int32, float32 và float64. Giao diện này cho phép hàm “chung” chấp nhận bất kỳ loại nào trong số này làm đối số. Sau đó, chúng tôi sử dụng một hàm chung có tên newGenericFunc nhận tham số emp_Age của một loại tuổi chung có thể là bất kỳ loại nào thỏa mãn giao diện EmpAge. Bên trong hàm, nó chuyển đổi emp_Age thành int và tăng nó lên 1 như được hiển thị.

Tiếp theo, chúng ta khai báo 2 biến Age1 và Age2 và gán giá trị lần lượt là 24 và 25.5 trong hàm main. Sau đó, Age1 và Age2 được chuyển dưới dạng tham số cho hàm newGenericFunc, hàm này sẽ thực hiện hai lần. Với điều này, độ tuổi được tăng lên 1 và tạo ra các giá trị được cập nhật.

Đầu ra được tạo ra sau đây là các độ tuổi từ chức năng chung sử dụng giao diện:

Ví dụ 3: Sử dụng Cấu trúc dữ liệu chung của Golang

Hơn nữa, Go generics cũng cung cấp cho chúng ta khả năng xây dựng các cấu trúc dữ liệu chung như ngăn xếp, hàng đợi và danh sách được liên kết. Xem xét việc triển khai ngăn xếp chung như sau:

nhập khẩu 'fmt'
kiểu Cây rơm [ bất kỳ ] [] t
chức năng ( st * Cây rơm [ t ]) ( mục T ) {
st = nối thêm ( * st , mục )
}
chức năng ( st * Cây rơm [ t ]) Nhạc pop () t {
nếu như chỉ một ( * st ) == 0 {
hoảng loạn ( 'Không có gì trong ngăn xếp' )
}
mục lục := chỉ một ( * st ) - 1
mục := ( * st )[ mục lục ]
* st = ( * st )[: mục lục ]
trở lại mục
}
chức năng chủ yếu () {
cây rơm := mới ( Cây rơm [ int ])
cây rơm . ( 1 )
cây rơm . ( 2 )
cây rơm . ( 3 )
fmt . Println ( cây rơm . Nhạc pop ())
fmt . Println ( cây rơm . Nhạc pop ())
fmt . Println ( cây rơm . Nhạc pop ())
}

Trong đoạn mã trước, một loại chung có tên là “Ngăn xếp” được xác định đại diện cho ngăn xếp. Trình giữ chỗ “T” cho phép ngăn xếp chứa các phần tử thuộc bất kỳ loại nào. Loại “Ngăn xếp” được triển khai dưới dạng một lát các phần tử thuộc loại “T”. Tại đây, hai chức năng được triển khai cho loại “Ngăn xếp”: “Đẩy” và “Bật”. Hàm Push() chịu trách nhiệm thêm các phần tử vào ngăn xếp. Nó nhận một mục đối số thuộc loại “T” và nối nó vào lát bên dưới bằng cách sử dụng hàm append().

Mặc dù hàm Pop() lấy thành phần ban đầu từ ngăn xếp và trả về nó, nhưng trước tiên, hàm này sẽ xác định xem ngăn xếp có trống hay không bằng cách đánh giá kích thước của lát bên dưới. Một thông báo lỗi được gửi nếu ngăn xếp có vẻ trống, điều này gây ra sự hoảng loạn. Mặt khác, nó lấy phần tử cuối cùng từ lát cắt, loại bỏ nó khỏi ngăn xếp bằng cách cắt lát cắt cho đến phần tử thứ hai đến phần tử cuối cùng và trả về mục đã loại bỏ.

Tiếp theo, chồng số nguyên mới được tạo bằng cú pháp Stack[int] trong hàm chính của mã này. Sau đó, phương thức “Đẩy” được gọi ba lần để thêm các số nguyên 1, 2 và 3 vào ngăn xếp. Tuy nhiên, phương thức “Pop” được gọi ba lần sau đó để truy xuất và in các phần tử từ ngăn xếp.

Đầu ra sau đây chỉ ra rằng các phần tử được lấy ra khỏi ngăn xếp theo thứ tự ngược lại:

Ví dụ 4: Sử dụng Golang Generic Constraints

Go cũng cung cấp các ràng buộc tùy chỉnh cho phép tính linh hoạt cao và xác định các yêu cầu cụ thể cho các cấu trúc chung dựa trên nhu cầu ứng dụng của chúng. Mã của các ràng buộc chung tùy chỉnh được cung cấp dưới đây để minh họa:

bưu kiện chủ yếu
nhập khẩu 'fmt'
kiểu sô học giao diện {
int64 | phao64
}
chức năng chủ yếu () {
giá trị nổi := [] phao64 { 2 . 0 , 4 . 0 , 6 . 0 , số 8 . 0 , 10 . 0 }
Giá trị số nguyên := [] int64 { 2 , 4 , 6 , số 8 , 10 }
tổng1 := tổng quát ( giá trị nổi )
tổng2 := tổng quát ( Giá trị số nguyên
fmt . Println ( 'Tổng của float64:' , tổng1 )
fmt . Println ( 'Tổng của int64:' , tổng2 )

}
chức năng tổng quát [ n số ]( con số [] N ) N {
đã từng là tôi là N
_ , trên một := phạm vi con số {
Tổng += trên một
}
trở lại Tổng
}

Trong mã nguồn trước, chúng tôi xác định giao diện Numerics bằng phương thức “Sum”. Sau đó, chúng tôi tạo hai loại tùy chỉnh, “FloatValue” và “IntegerValue”, triển khai giao diện Numerics bằng cách cung cấp các phương thức “Sum” tương ứng của chúng. Hàm genericSum hiện có thể chấp nhận các lát cắt thuộc bất kỳ loại nào thỏa mãn giao diện Numerics. Bên trong hàm, chúng ta lặp lại các phần tử và gọi phương thức “Sum” để tính tổng. Cuối cùng, trong hàm chính, chúng ta tạo các lát FloatValue và IntegerValue và chuyển chúng tới hàm genericSum() để tính toán chính xác tổng các phần tử trong mỗi lát.

Đầu ra dự kiến ​​hiện có thể nhìn thấy trên màn hình sau:

Phần kết luận

Chúng tôi đã khám phá một số ví dụ thực tế về Go generics, bao gồm việc tạo cấu trúc dữ liệu chung và chức năng chung, xác định giao diện chung và sử dụng ràng buộc loại tùy chỉnh. Những ví dụ này chứng minh sức mạnh và tính linh hoạt mà các bản gốc mang lại cho ngôn ngữ lập trình Go. Lưu ý rằng việc tạo mã chung trong quá trình biên dịch đảm bảo kích thước nhị phân và thời gian biên dịch hiệu quả.