thảo luận Tất tần tật về Go (Golang)

Èo, như vi dụ này lỡ nó thành "callback hell" sao bác
Bác đã return rồi còn tiếp tuc gì nữa. Thuong thi đa phần return error chỉ check cái error đặc biệt thôi còn lại error general thì return ra rồi handler middleware gì ây cho no 500 internal error + log lai thôi.

Phải enforces cái style là đã error thì return ngay. Như code vi dụ auth fail , fail chính xác do invalid password or email ko tìm thấy thì return error API ko thì cứ return error thoi. handler middleware thấy return error API thì render theo cái error đó. con error ko xác dinh thì check mấy cái error phổ biến ko có thì render 500 thôi.

Này tuỳ code thực tế tới đâu nữa, usecase của mình tới đó là hết.

Nói chung try catch cũng đâu có ngăn chặn vấn đề đó, thậm chí còn tệ hơn.
 
Last edited:
Cái hay của Go tôi thấy là viết UT dễ và sướng, concept interface của nó cũng rất hay: parameter consumer định nghĩa interface của parameter đó, chứ ko bị giới hạn bởi type của parameter -> cảm thấy logic hơn nhiều.

Go đề cao tính thực dụng chứ ko phải đề cao 1 ideology nào, nên lướt qua thì thấy có vẻ ko hấp dẫn, nhưng lúc làm nhiều mới thấy bánh cuốn ae ạ.
 
Tuy exception cost lớn hơn error-code nhưng có ưu thế cực lớn ở high-level. Vd như modeling một đống domain model phức tạp nhiều component làm việc với nhau mà thằng caller cứ phải quan tâm handle error-code mà callee trả ra thì rất rối rắm và làm phức tạp flow. Vd như khi chuyển tiền bị lỗi thì ném ra OutOfMoneyException() hay LockedAccountException() nó rõ ràng hơn rất nhiều và có thể catch ở chỗ thích hợp trong call chain.

Còn error-code phù hợp hơn ở low-level vì khi đó các component nó phần lớn nằm ở infrastructure layer, bọn nó có couple với nhau cũng không phải là vấn đề gì lớn..
 
Tuy exception cost lớn hơn error-code nhưng có ưu thế cực lớn ở high-level. Vd như modeling một đống domain model phức tạp nhiều component làm việc với nhau mà thằng caller cứ phải quan tâm handle error-code mà callee trả ra thì rất rối rắm và làm phức tạp flow. Vd như khi chuyển tiền bị lỗi thì ném ra OutOfMoneyException() hay LockedAccountException() nó rõ ràng hơn rất nhiều và có thể catch ở chỗ thích hợp trong call chain.

Còn error-code phù hợp hơn ở low-level vì khi đó các component nó phần lớn nằm ở infrastructure layer, bọn nó có couple với nhau cũng không phải là vấn đề gì lớn..
error khác exception, vd thím đi chơi vs gấu, nếu thím quên không mang tiền thì đó là lỗi, nếu thím bị xe tông thì đó là exception, lạm dụng exception coi chừng có ngày bị ăn gạch vào đầu :beat_brick:
ví dụ khác:
a-=1000;
if (a < 0) throw OutOfMoneyException();
b+=1000;
trường hợp này nếu không bắt exception trong hàm thì khả năng cao biến a sẽ bị trừ tiền trong khi b chưa đc cộng tiền mà không ai biết (do khác domain/context). Cách giải quyết là bắt và xử lý exception luôn trong hàm, nhưng như thế còn cồng kềnh hơn error-code.
 
a-=1000;
if (a < 0) throw OutOfMoneyException();
b+=1000;
trường hợp này nếu không bắt exception trong hàm thì khả năng cao biến a sẽ bị trừ tiền trong khi b chưa đc cộng tiền mà không ai biết (do khác domain/context). Cách giải quyết là bắt và xử lý exception luôn trong hàm, nhưng như thế còn cồng kềnh hơn error-code.
Thực tế thì cái ví dụ của thím bọn ORM lại dùng rất nhiều để rollback transaction. ví dụ của thím thì dùng error code lại càng vỡ mồm vì ORM không rollback lại, thằng a bị trừ tiền mà thằng b vẫn không được cộng
a-=1000;
if (a < 0) return;
b+=1000;
 
Mấy thím cho em hỏi, em mới tập học lập trình, đang định học theo hướng: C++ & OPP => Java
Em cũng có tìm hiểu về Golang và thấy các tiền bối khen nức nỡ như thớt này.
Thời điểm fresher này có nên tìm hiểu golang không ? hay học các cái kia trước
Thanks các thím
 
Thực tế thì cái ví dụ của thím bọn ORM lại dùng rất nhiều để rollback transaction. ví dụ của thím thì dùng error code lại càng vỡ mồm vì ORM không rollback lại, thằng a bị trừ tiền mà thằng b vẫn không được cộng
Bạn đọc lại nhé, cách của mình là xử lý lỗi ngay trong hàm chứ không throw hay return đi đâu cả, lỗi ở đâu xử lý ở đấy, tránh undefined behavior
 
Last edited:
Nói chung các bác học vì niềm vui thì học ngôn ngữ nào cũng đc :D, như trước mình có sài qua Elixir như thím Nipin ở trên, do cái mình thích học là mindset functional mà scalar cũng có nói chung functional của thằng scala nó ở cái tầng cao hơn. Còn học vì nhu cầu công việc kiếm $ thì học các ngôn ngữ có độ phổ biến cao để mà có việc làm chứ, nhưng phổ biến cao thì nhiều thằng học nhiều thằng cạnh tranh. Học Elixir như bác trên thì ít job nhưng ít thằng học vô kiếm đc jobs bằng ngôn ngữ đó húp $ cũng cao hơn :D. Anyway nói chung là giỏi thì éo lo chết đói, do thị trường VN còn outsourcing nhiều, chừng nào VN chỉ toàn làm prod thì các bác lấy ngôn ngữ éo gì cũng đc. Đối với mình thì ngôn ngữ framework nó chỉ là tools để phục vụ cho business là chính thôi.
:LOL:) bạn zai làm ở đâu mà điện gì đấy :LOL: EVN à
 
Ý thím là sao :censored:
Ví dụ:
JSON:
package A
func x(a TypeA){
    a.read()
   //...
}

type TypeA interface{
    read() int
}

Thì khi function x cần parameter có read function thôi chẳng hạn, thì nó sẽ define TypeA ở ngay bên trong package chứa function x, và khi dùng func x, thì có thể pass bất cứ Type nào vào, chỉ cần Type đó có implement function read.

Cách này làm cho package A loosely couple vs user của package A, đồng thời đảm bảo là package A sẽ chỉ dùng những gì cần dùng, và TypeA definition sẽ closer with business function của package A, thay vì của package tạo ra parameter đó.
 
Last edited:
Mấy thím cho em hỏi, em mới tập học lập trình, đang định học theo hướng: C++ & OPP => Java
Em cũng có tìm hiểu về Golang và thấy các tiền bối khen nức nỡ như thớt này.
Thời điểm fresher này có nên tìm hiểu golang không ? hay học các cái kia trước
Thanks các thím

Học C++ mệt lắm, khuyên không nên học.
 
Thực tế thì cái ví dụ của thím bọn ORM lại dùng rất nhiều để rollback transaction. ví dụ của thím thì dùng error code lại càng vỡ mồm vì ORM không rollback lại, thằng a bị trừ tiền mà thằng b vẫn không được cộng
Tuỳ context thôi, usual guideline sẽ là exception chỉ nên dùng cho TH mà lỗi đó khiến cho service đó ko thể tiếp tục được nữa, lỗi trong business logic phần lớn sẽ là error.

Critical service thì hầu như ko bao h throw exception, giả sử mỗi thread xử lý 1 transaction cho 1 customer, mà 1 transaction throw exception khiến cả con server restart thì thôi, vỡ cmn mồm.
 
Build REST API thì Echo hay Gin ngon hơn hở các bác?
Ngoài Echo và Gin ra thì còn thằng nào ngon nữa hở các bác?
 
Golang sẽ thay thế Nodejs ở các startups, cân vs Netcore/Java ở enterprise dc ko? Các thím cho lời khuyên?:adore:
Đang dùng golang đây, golang ngon vl luôn ấy, dùng đa luồng bá đạo nhất trong các ngôn ngữ rồi, mà các dịch vụ bây h phải dùng đa luồng, cái tiếp là deploy 1 project golang cực thích luôn vì build golang rất nhanh mà run thì cũng nhanh không kém, chạy cực đơn giản vì build xong n thành mã máy luôn, ko cần phải chạy máy ảo như java hay chạy thư viện liên kết động như c++
 
Đang dùng golang đây, golang ngon vl luôn ấy, dùng đa luồng bá đạo nhất trong các ngôn ngữ rồi, mà các dịch vụ bây h phải dùng đa luồng, cái tiếp là deploy 1 project golang cực thích luôn vì build golang rất nhanh mà run thì cũng nhanh không kém, chạy cực đơn giản vì build xong n thành mã máy luôn, ko cần phải chạy máy ảo như java hay chạy thư viện liên kết động như c++
Thế còn bản thân cái ngôn ngữ thì sao :confused:
http://tmikov.blogspot.com/2015/02/you-dont-like-googles-go-because-you.html.
 
Ngôn ngữ càng bị chửi nhiều chứng tỏ là càng nhiều người dùng, chuyện quá bt.

Chửi 1 ngôn ngữ thì phải nói được use case của các bạn là j. Kn của tôi maintain critical backend microservices, qps 20k chạy ngon trên cluster 80 instances, mỗi ngày xử lý gần 10 triệu transaction, weekly deployment ầm ầm.

Đội dev nhiều người, cần collab nhiều, thì ngôn ngữ nó phải đơn giản, hạn chế những tính năng hack não để tập trung vào dev business feature. Còn 1 người, 1 service thì code go thấy thiếu thiếu, gượng gượng rồi chửi, tôi nghĩ chắc cũng bt.

Use the right tool for the right job. Vậy job của bạn là j? Mà chỉ thấy bàn về tool?
 
Last edited:
ed của crystal hay nim ăn đứt go, vì chúng nó backend là LLVM/GCC (nim thì transpile sang c, lúc đó thì dùng clang hay gcc để compile đều được, crystal thì transpile sang llvm opcod
Team mình có những thành viên xây dựng hệ thống cho zalo với zing từ ngày đầu nhé, stack của bọn mình là layer storage c++ ( cái này không ngôn ngữ nào có thể thay thế rồi) , service ( golang is best choice), frontend reactjs. Đây là 1 dự án của bọn mình nhé https://butta.vn/ . Ns chung mảng backend có những cái buộc phải dùng c++ thì ngoài ra dùng golang là best choice , trước mình cũng dev .NEt suốt nhưng h dị ứng với mấy cái máy ảo lắm rồi.
 
Back
Top