Những điều nên biết về type alias ở Go1.9
Go
50
golang
49
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

116 bài viết.
945 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
148 14
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 gần 2 năm trước
148 14
White
118 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 hơn 3 năm trước
118 15
White
95 10
(Ảnh) Mở đầu Chắc nhiều bạn đã nghe đến khái niệm oauth. Về cơ bản thì oauth là một phương thức chứng thực, mà nhờ đó một web service hay một ap...
huydx viết 3 năm trước
95 10
Bài viết liên quan
White
16 0
Crawl dữ liệu Crawl là một vấn đề hay gặp trong quá trình làm software. Ví dụ lấy tin tức, tin giảm giá, vé xem phim... là những dạng của crawl. Mộ...
Thach Le viết hơn 2 năm trước
16 0
White
9 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 2 năm trước
9 2
{{like_count}}

kipalog

{{ comment_count }}

bình luận

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


White
{{userFollowed ? 'Following' : 'Follow'}}
116 bài viết.
945 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á!