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

cái vụ gom rác này của Go thường thì thích còn cao thì méo thích. Đọc vài bài bên bọn Tây nó chán cái GC này củ Go. Chính nó làm thọt per của Go đi rất nhiều.
Các anh giỏi viết backend bằng C++ hay Rust đi ;)
Trừ khi sản phẩm có được nhiều CCU khủng như Shopee, còn không cứ dùng Go là đủ rồi
tFvvWhy.jpg
 
Bên mình tính build hệ thống backend sử dụng framework Flasgger bên Python, ko biết bên Go có cái nào tương tự ko nhỉ, dự tính ban đầu là làm cục monolithic đã (scale hệ thống đã có Kubernetes lo), sau này cần thì chia nhỏ thành micro-service nếu sản phẩm thật sự cần, vì sợ chưa có kinh nghiệm mà lao vào micro-service gây rối rắm về kiến trúc.
 
quá ghê, mình cũng 30 mà chỉ làng nhàng. Thím học những gì mà vô được google vậy? Mình tham khảo nâng trình lên tí
Giờ mới lội vào đây. Mình cũng bằng tuổi mà khéo còn làng nhàng hơn.
Thời sv cũng vùng vẫy lập trình thi cử nọ kia mà xong bỏ xó :sad:

Tiếc là ko lớn lên ở SG, quá nhiều cơ hội và dễ dàng tiếp cận.
Thời mình ra trường thì HN ngập tràn outsource Nhật, lựa chọn khác mà nhiều ng mong muốn là các tập đoàn nhà nước VNPT Viettel, thời đó cực chảnh chó coi ứng viên như cỏ rác, mà giờ đỡ hơn rồi. Hồi đó mông lung về sự nghiệp, vác lên voz hỏi mà cũng ko có ai chỉ lối.

Giờ thì ko đến nỗi quá tệ nhưng cũng ko có gì happy lắm. HN giờ nhiều cty xịn hơn nhưng cơ bản vẫn đéo bằng SG. Mấy thằng bạn học hành bthg, gắn bó viettel với vcb lương 1 năm cũng lên gần tỷ cmnr.

=====
Btw, cũng là dev chính java và có cơ hội trải nghiệm go. Để ko OT thì góp ý vài nhận xet, tuy ko đào sâu go:
  • OOP Golang ko focus vào, nên điểm xấu mọi ng nói nhiều rồi. Thấy interface của go tiện ở chỗ: không nhất thiết phải implement từ interface như java -> có thể dùng interface để lọc các struct cần thiết mà ko phải sửa các struct đó. Tương tự có thể thoải mái thêm method ở 1 chỗ khác mà ko phải sửa class như java.
  • go concurrency base preemptive khá là nhanh gọn nhẹ. java có thể dùng akka actor của scala mà cảm thấy ko ngon bằng go channel.
  • cách quản lý dependencies tệ vcl, tương tự khiến việc dùng grpc bị cũng gặp rắc rôi với versioning
.... chưa nhớ ra thêm gì nữa.
 
Giờ mới lội vào đây. Mình cũng bằng tuổi mà khéo còn làng nhàng hơn.
Thời sv cũng vùng vẫy lập trình thi cử nọ kia mà xong bỏ xó :sad:

Tiếc là ko lớn lên ở SG, quá nhiều cơ hội và dễ dàng tiếp cận.
Thời mình ra trường thì HN ngập tràn outsource Nhật, lựa chọn khác mà nhiều ng mong muốn là các tập đoàn nhà nước VNPT Viettel, thời đó cực chảnh chó coi ứng viên như cỏ rác, mà giờ đỡ hơn rồi. Hồi đó mông lung về sự nghiệp, vác lên voz hỏi mà cũng ko có ai chỉ lối.

Giờ thì ko đến nỗi quá tệ nhưng cũng ko có gì happy lắm. HN giờ nhiều cty xịn hơn nhưng cơ bản vẫn đéo bằng SG. Mấy thằng bạn học hành bthg, gắn bó viettel với vcb lương 1 năm cũng lên gần tỷ cmnr.

=====
Btw, cũng là dev chính java và có cơ hội trải nghiệm go. Để ko OT thì góp ý vài nhận xet, tuy ko đào sâu go:
  • OOP Golang ko focus vào, nên điểm xấu mọi ng nói nhiều rồi. Thấy interface của go tiện ở chỗ: không nhất thiết phải implement từ interface như java -> có thể dùng interface để lọc các struct cần thiết mà ko phải sửa các struct đó. Tương tự có thể thoải mái thêm method ở 1 chỗ khác mà ko phải sửa class như java.
  • go concurrency base preemptive khá là nhanh gọn nhẹ. java có thể dùng akka actor của scala mà cảm thấy ko ngon bằng go channel.
  • cách quản lý dependencies tệ vcl, tương tự khiến việc dùng grpc bị cũng gặp rắc rôi với versioning
.... chưa nhớ ra thêm gì nữa.

1. Lương dev gần 1 tỷ 1 năm thì mạnh lắm rồi bạn ơi, bảo trung bình ra 3k3/tháng thì saigon cũng hiếm. Giờ t mới biết Viettel/Vcb bạo chi vậy đó.

2. THời đại nào rồi còn OOP hả bạn ơi, OOP để chém lý thuyết suông lúc phỏng vấn hay gì à?
 
1. Lương dev gần 1 tỷ 1 năm thì mạnh lắm rồi bạn ơi, bảo trung bình ra 3k3/tháng thì saigon cũng hiếm. Giờ t mới biết Viettel/Vcb bạo chi vậy đó.

2. THời đại nào rồi còn OOP hả bạn ơi, OOP để chém lý thuyết suông lúc phỏng vấn hay gì à?

1. À ban đầu dev nhưng có chức danh hết rồi, ko phải ai mới vào cũng cao. mấy cty nhà nước tiền nhiều lắm ko tiếc tiền để giữ chân nhân viên. Quy trình thì hơi lởm nên chi phí thay người khác quá lớn và rủi ro. Viettel gò bó, ít người làm lâu dài, tầm 25-26t đã lên lead là bình thường. Chịu gắn bó sẽ có chán nhưng lương tăng đều, rất là update với thị trường.

2. haha nếu OOP chỉ để pv thì sv lên mạng học thuộc 4 tính chất là trả lời ngon rồi. OOP + pattern hình thành nên tư duy tổ chức code abstraction, có học thuộc làu lý thuyết cũng ko phải ai cũng biết dùng hiệu quả. Giờ có nhiều trường phái khac, OOP ko còn là tôn chỉ nhưng mình vẫn phải công nhận ảnh hưởng của nó. Dù ko dùng OOP thì nó vẫn có ý nghĩa nhất định, chứ ko 2-3 ng contribute vào 1 project chỉ vài bữa là nát bấy, hoặc phải review code kèm chặt junior.
 
cách quản lý dependencies tệ vcl
Dùng Go Module cũng méo thấy tệ lắm
Con go này mình theo dõi lâu rồi trước tham vọng nhiều giờ có vẻ đuối r
Chả thấy đuối gì cả, làm product mỳ ăn liền phục vụ loanh quanh nước Việt Nam 120 triệu dân này cứ dùng Go là nhanh lẹ
Trên vietnamworks cũng tuyển người làm Go đầy ra
 
Last edited:
Mới gọc Go đến đoạn interface ngáo luôn các thím ạ :too_sad:

Thím nào có tâm giải thích cho em ưu điểm của implicit implementation của Go so với explicit implementation của C#, Java không ạ? :too_sad:
 
Mới gọc Go đến đoạn interface ngáo luôn các thím ạ :too_sad:

Thím nào có tâm giải thích cho em ưu điểm của implicit implementation của Go so với explicit implementation của C#, Java không ạ? :too_sad:
Thớt dài 15 page nhưng mục đích chính vẫn là các môn đồ của C#, Java chửi bới OOP và Generic của Golang mà
 
Last edited:
Thớt dài 15 page nhưng mục đích chính vẫn là các môn đồ của C#, Java chửi bới OOP và Generic của Golang mà
Cảm ơn thím, cái này coi dễ hiểu :beauty:

Cái nữa em thắc mắc là implicit có ưu điểm gì so vơi explicit truyền thống trong C#, Java?
 
Em ko phải dân CNTT. Nhưng gần đây có tìm hiểu học Java do rảnh. :sweat:

Xem video của thằng nào trên Zootube ấy. Nó phân tích dựa trên thống kê về mức lương, nhu cầu tuyển dụng, độ phổ biến,...

Chốt là mới học thì nên Java, có kinh nghiệm 2 năm trở lên, muốn phát triển tiếp thì nên học Go.
(Cũng có vài ý kiến là nên học C/C++ trước rồi học Java. Nhưng đc cái E học C/C++ hồi còn đi học rồi nên quất Java luôn).

Tự hỏi Go nó phải thế nào thì mới có vị thế như vậy chứ. Mà em thấy aura VOZ thường đúng...
Hay là ko học Java nữa học Go nhỉ 8-)
 
Cảm ơn thím, cái này coi dễ hiểu :beauty:

Cái nữa em thắc mắc là implicit có ưu điểm gì so vơi explicit truyền thống trong C#, Java?
Ưu điểm là flexible hơn
Nhược điểm là IDE support cùi hơi, code navigate khó hơn, không express intent của impl
Nói mịa ra implicit interface là thể loại xăng pha nhớt.
Nếu bạn chưa học qua C#,Java thì nên học trước rồi hẳng học Go, học thằng Go này trước ngu người hết
 
Ưu điểm là flexible hơn
Nhược điểm là IDE support cùi hơi, code navigate khó hơn, không express intent của impl
Nói mịa ra implicit interface là thể loại xăng pha nhớt.
Nếu bạn chưa học qua C#,Java thì nên học trước rồi hẳng học Go, học thằng Go này trước ngu người hết
Em cảm ơn thím ạ, em có học qua C# rồi nên mới thắc mắc implicit implement có ưu điểm gì hơn :adore:
 
Em cảm ơn thím ạ, em có học qua C# rồi nên mới thắc mắc implicit implement có ưu điểm gì hơn :adore:
Do những người sáng tạo ra Go họ thích thế.
Việt Nam bắt đầu đại học thì học C++ xong học tiếp là Java,
học trung tâm thì kỳ 2 bắt đầu Java/C#.
Chứ dân Mỹ từ bé học Scratch nên họ không đội Java/C# lên đầu
 
Do những người sáng tạo ra Go họ thích thế.
Việt Nam bắt đầu đại học thì học C++ xong học tiếp là Java,
học trung tâm thì kỳ 2 bắt đầu Java/C#.
Chứ dân Mỹ từ bé học Scratch nên họ không đội Java/C# lên đầu
Cảm ơn thím em mới học nên cũng phải lấy mấy thằng đã biết ra so sánh :byebye:

Cái nữa em muốn hỏi trong Go vẻ có nhiều cách declare variable quá k biết người ra prefer cách gì nhỉ. Vd như tạo array hay slice sơ sơ có vài cách như sau:

Code:
var a [3]int
var a = [3]int{}
a := [3]int{}

var s []int
var s = []int{}
var s = make([]int, 3)
 
Last edited:
hỏi ngu nên không lập topic, tạm vào đây hỏi phần Channel Synchronization

package main

import (
"fmt"
"time"
)

func worker(done chan bool) {
fmt.Print("working...")
time.Sleep(time.Second)
fmt.Println("done")

done <- true
}

func main() {

done := make(chan bool, 1)
go worker(done)

<-done
}

mấy thím cho hỏi cái đoạn <- done màu đỏ nghĩa là sao ? Nếu em vứt đoạn đó đi thì nó sẽ bị lỗi
đọc ở gobyexample thì nó có giải thích rằng
Block until we receive a notification from the worker on the channel.
If you removed the <- done line from this program, the program would exit before the worker even started.
đã đọc công dụng của channel operator
ch <- v // Send v to channel ch.
v := <-ch // Receive from ch, and
// assign value to v.
nhưng <-done đứng 1 mình thì mình không hiểu :cry:
 
hỏi ngu nên không lập topic, tạm vào đây hỏi phần Channel Synchronization



mấy thím cho hỏi cái đoạn <- done màu đỏ nghĩa là sao ? Nếu em vứt đoạn đó đi thì nó sẽ bị lỗi
đọc ở gobyexample thì nó có giải thích rằng

đã đọc công dụng của channel operator

nhưng <-done đứng 1 mình thì mình không hiểu :cry:
Main thread sẽ block đến khi nào channel done có output, tức là khi worker trả về true,
Ko có dòng này thì main thread sẽ return mà ko đợi thread worker hoàn thành.
 
Last edited:
Cái nữa em muốn hỏi trong Go vẻ có nhiều cách declare variable quá k biết người ra prefer cách gì nhỉ. Vd như tạo array hay slice sơ sơ có vài cách như sau:

Code:
var a [3]int
var a = [3]int{}
a := [3]int{}

var s []int
var s = []int{}
var s = make([]int, 3)
Móa, cái này mà cũng phải lăn tăn, thích dùng gì thì dùng thôi
 
Last edited:
Main thread sẽ block đến khi nào channel done có output, tức là khi worker trả về true,
Ko có dòng này thì main thread sẽ return mà ko đợi thread worker hoàn thành.
Thím giải thích giúp em đoạn này
Code này chạy không lỗi

Code:
package main

import (
    "fmt"
    "time"
)

func worker(done chan bool, num chan int) {
    fmt.Print("working...")
    time.Sleep(time.Second)
    fmt.Println("done")
 
    done <- true
    num <- 3
}

func main() {

    done := make(chan bool)
    num := make(chan int)
    go worker(done, num)
 
    <-done
}

nhưng nếu ta đổi chút sẽ lỗi

Code:
package main

import (
    "fmt"
    "time"
)

func worker(done chan bool, num chan int) {
    fmt.Print("working...")
    time.Sleep(time.Second)
    fmt.Println("done")
 
    num <- 3
    done <- true // change order
 
}

func main() {

    done := make(chan bool)
    num := make(chan int)
    go worker(done, num)
 
    <-done
}
 
Thím giải thích giúp em đoạn này
Code này chạy không lỗi



nhưng nếu ta đổi chút sẽ lỗi
vẫn là trường hợp trên mà bác nãy nói thôi:
Code:
Main thread sẽ block đến khi nào channel done có output, tức là khi worker trả về true,
Ko có dòng này thì main thread sẽ return mà ko đợi thread worker hoàn thành.

  • goroutine worker không bị deactive ở case 1 là do nó vẫn đợi value của chanel done
  • ở case 2 main thread close nên goroutine worker deactive nhưng vẫn thay đổi giá trị của num nên sinh ra deadlock thôi
 
Back
Top