Avatar
0
monkey Enlightened
monkey Enlightened
[Go] khi nào go func được gọi?
Mình có hàm helloWorld thế này:

func helloWorld() {
	fmt.Print("Hello");
	go func() {
		fmt.Println(" World");
	}()
}

Nhưng khi gọi hàm này thì không thấy World được in ra, vậy khi nào go func được gọi mọi người nhỉ?

  • Answer
go
Remain: 5
4 Answers
Avatar
ducnt114 Enlightened
ducnt114 Enlightened
The Best Answer
khả năng là hàm helloWorld() đã thực thi xong và chương trình của bạn đã thoát trước khi go func() được chạy.

Bạn thử sleep vài giây ở cuối hàm helloWorld() thì sẽ thấy go func() chạy và in ra màn hình.

  • 1
  • Reply
Vẫn không được:

helloWorld()
time.Sleep(1000)

Nếu chỉ để thế này thì OK:

func helloWorld() {
	fmt.Print("Hello");
	func() {
		fmt.Println(" World");
	}()
}

Vậy sự khác biệt giữa có go và không có go là gì?

 –  monkey 1634179771000
Hàm sleep bạn đang dùng sai

func main() {
	helloWorld()
	time.Sleep(2*time.Second)
}

func helloWorld() {
	fmt.Print("Hello");
	go func() {
		fmt.Println(" World");
	}()
}
 –  ducnt114 1634180032000
Hoặc có 1 cách khác dùng channel như thế này

func main() {
	helloWorld()

}

func helloWorld() {
	fmt.Print("Hello");
	c := make(chan int)
	go func() {
		fmt.Println(" World");
		c <- 1
	}()
	<- c
}
 –  ducnt114 1634180114000
Khi có go thì sẽ function sẽ được chạy ở 1 routine khác, nếu routine chính (helloWorld) không đợi routine mới khởi tạo (go func) thực thi xong mà đã kết thúc thì sẽ không nhìn thấy kết quả của routine go func.  –  ducnt114 1634180232000
Avatar
tvd12 Enlightened
tvd12 Enlightened
Vậy thì lợi ích của việc viết hàm go func này là gì? nó khác gì với việc dùng defer?
  • 0
  • Reply
go func sẽ thực hiện function đó ở một context khác anh ạ. còn defer thì khi kết thúc cái context của hàm đó thì nó sẽ được thực hiện cuối cùng ạ  –  Cesc Nguyễn 1636616550000
Avatar
Cesc Nguyễn Enlightened
Cesc Nguyễn Enlightened
bản chất ở đó là nó chạy 1 goroutine khác so với main routine anh nha. Mà do main routine đã kết thúc trước khi goroutine print chữ "world" được gọi. Vì thế mình không nhìn thấy nó in ra. Nếu muốn nhìn thấy "hello world" em nghĩ có thể sleep chương trình lại một chút hoặc dùng channel để block lại chương trình cho đến khi in ra
  • 1
  • Reply
Đúng anh Thược rồi 😁  –  Nguyễn Đức Thái 1634408399000
Avatar
Cesc Nguyễn Enlightened
Cesc Nguyễn Enlightened
ơ chú cũng dùng nền tảng này à. thi thoảng lên đây ae trao đổi chiêu thức
  • 0
  • Reply