Những điều nên biết về type alias ở Go1.9
Go
41
golang
40
White

huydx viết ngày 15/06/2017

Go1.9 vừa ra bản beta1, có thể download về để dùng bằng cách dưới đây để đảm bảo không break go ở local machine

go get golang.org/x/build/version/go1.9beta1
go1.9beta1 download
go1.9beta1 version

Trong những tính năng của go1.9 thì có một tình năng đáng chú ý, và đã được bàn cãi rất nhiều gọi là Type Alias. Có một số bài viết giải thích rất rõ ràng về tính năng này mà các bạn có thể tham khảo tại:

Có một điểm rất dễ nhầm lẫn là golang hiện tại có thể "gán" một type đã có vào một type "mới" thông qua cú pháp

type NewInt int

Chức năng đó được gọi là Type Declaration.
Cách dùng của Type Alias gần tương tự như Type Declaration, khác ở một dấu "="

type T1 = T2

So sánh giữa Type Alias và Type Declaration có thể được tham khảo tại design doc: https://github.com/golang/proposal/blob/master/design/18130-type-alias.md#comparison-of-type-declarations-and-type-aliases

Điểm khác biệt có thể tóm gọn lại ở mấy điểm chính:

type T1 T2    // type declaration
type T1 = T2  // type alias
  • Type Declaration định nghĩa 1 type T2 khác với T1. Do đó, mà các composity type sử dụng T1 sẽ khác với các composite type sử dụng T2, cũng như là pointer type (*T1) cũng sẽ khác với pointer type (*T2)
  • Ngược lại với Type Alias, T1, T2 chỉ là 2 cái "tên" khác nhau, trỏ về cùng 1 type.

Mục đích chính của Type alias được ghi khá dễ hiểu trong blog của Russ

There is a recurring problem with moving types from one package to another during large codebase refactorings. We tried to solve it last year with general aliases, which didn’t work for at least two reasons: we didn’t explain the change well enough, and we didn’t deliver it on time, so it wasn’t ready for Go 1.8. Learning from that experience, I gave a talk and wrote an article about the underlying problem, and that started a productive discussion on the Go issue tracker about the solution space. It looks like more limited type aliases are the right next step. I want to make sure those land smoothly in Go 1.9. #18130.

Điểm nhấn quan trọng nhất ở đây chính là ở đoạn "refactoring", khi library designer quyét định chuyển vị trí (hoặc là tên) của một số type, từ package này sang package khác. Việc này dẫn đến người dùng (client) sẽ phải update, chạy theo library designer liên tục. Với một số core package, thì tầm ảnh hưởng (số lượng client phải update theo) sẽ là rất lớn, cũng như sẽ dẫn đến cả việc phóng đại (amplifying) khi mà ảnh hưởng theo dây chuyền: core lib X -> lib Y -> lib Z -> client 1...client N.

Tại sao chức năng này bị phản đối nhiều đến vậy? Xem lại proposal tại Github, bạn có thể thấy rất nhiều downvote. Lý do lớn nhất chính bị phản đối chính là do người dùng lo sợ việc bị "abuse" (abuse ở đây có thể hiểu là sử dụng nhầm, sử dụng sai, cũng như bị lạm dụng khi không thực sự cần thiết). Các trường hợp dễ bị abuse đã được Russ tổng hợp tại https://github.com/golang/go/issues/18130#issue-192757828 mà các bạn có thể tham khảo thêm.

Ngoài ra để implement chức năng này cũng ảnh hưởng đến một loạt các package quan trọng như

  • cmd/compile
  • gccgo
  • go/ast
  • go/parser
  • go/printer ....

Vậy chúng ta có thể rút ra được mấy điểm chính ở đây:

  • Type Declaration != Type Alias
  • Chỉ nên sử dụng Type Alias khi không còn cách nào khác
Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

huydx

118 bài viết.
1253 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
226 20
Một ngày đẹp trời, bạn quyết định viết một dịch vụ web dự định sẽ làm thay đổi cả thế giới. Dịch vụ của bạn sẽ kết nối tất cả các thiết bị di động ...
huydx viết hơn 2 năm trước
226 20
White
194 15
Introduction (Link) là một cuộc thi ở Nhật, và cũng chỉ có riêng ở Nhật. Đây là một cuộc thi khá đặc trưng bởi sự thú vị của cách thi của nó, những...
huydx viết hơn 4 năm trước
194 15
White
151 15
Happy programmer là gì nhỉ, chắc ai đọc xong title của bài post này cũng không hiểu ý mình định nói đến là gì :D. Đầu tiên với cá nhân mình thì hap...
huydx viết 6 năm trước
151 15
Bài viết liên quan
White
12 2
Makefile thực hiện một số thao tác thường dùng trong Go Khi làm project Go mình thường tạo một file Makefile dạng này: Lưu ý nhớ thay thành tên m...
Huy Trần viết gần 5 năm trước
12 2
White
55 17
Go là gì? Dùng nó cho việc gì? Chắc hẳn đến thời điểm hiện tại, không ai là chưa nghe đến Go (hay còn gọi là Golang), một ngôn ngữ lập trình được ...
Huy Trần viết gần 6 năm trước
55 17
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
118 bài viết.
1253 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!