Avatar
1
Nguyễn Văn Thịnh Beginner
Generic type in golang
Mình vẫn thắc mắc tại sao Golang không (chưa) hỗ trợ generic type, bạn nào biết có thể chỉ mình với được không ? Vì mình cảm giác việc duplicate code xảy ra khá thường xuyên...
  • Answer
question
Remain: 5
1 Answer
Avatar
tvd12 Beginner
tvd12 Beginner
Mình đi code lại con tendermint này ở công ty, thì mình thấy thế này nhé. Generics sẽ có 2 kiểu:

  1. Khi biên dịch sẽ bỏ hết generic type đi, và ở runtime sẽ ép kiểu sau (như java): cách này thì biên dịch sẽ không sinh ra lớp mới, tuy nhiên là sẽ bị tốn performance khi ép kiểu.
  2. Khi biên dịch sẽ giữ lại generic type, ví dụ như List thì sẽ dịch thành ListInt hoặc List sẽ dịch thành ListString (C

    hãy C++ đang làm vậy)

Tuy nhiên với go thì mình không thấy có kiểu basic kiểu java.lang.Object, vậy thì làm theo kiểu 1 thì cũng không được, vì không có basic type thì sau ép kiểu kiểu gì nhỉ?

Tiếp theo nữa là cái kiểu viết hàm của go sẽ kiểu func (bz HexBytes) MarshalJSON() ([]byte, error) { nếu viết generic type sẽ kiểu này: func (bz T) MarshalJSON() ([]byte, error) { Vậy thì nếu dịch theo kiểu 2 thì chẳng lẽ sẽ địch cho mọi đối lớp có trong chương trình sao?

Vậy nên mình nghĩ rằng generics sẽ là 1 cơn đau đầu không dễ chịu cho tác giả của go, và nếu có viết thì chắc sẽ phải chọn phương án 1.

  • 1
  • Reply
Mình cảm ơn bạn rất nhiều về sự chia sẻ. Toàn là những điều mình chưa nghĩ tới. Nhân tiện mình thấy cũng có một số anh em build-in ra generic type như vầy, không biết bác Rob Pike có hứng thú không nữa. https://go2goplay.golang.org/  –  Nguyễn Văn Thịnh 1636766062000