go f() 가 반환값을 가진다면 어떨까요?

71 views
Skip to first unread message

jhan

unread,
Sep 11, 2012, 12:21:06 AM9/11/12
to golang...@googlegroups.com
이런 의견이 이미 논의되었을지도 모른다는 생각이 들긴 하는데요.
java에서의 Future에 해당하는 기능이 멋지게 구현될 것 같아서요.

지금은 longRunningTask() 함수를 concurrent하게 실행하도록 호출할 때,

go longRunningTask()

처럼 하면되지만, 반환값이 있어서 그 결과값을 나중에 쓰고 싶을 때에는..

c := make(chan int)
go func() {
  c <- longRunningTask()
}()
// doing other task 
use <-c here

처럼 채널을 이용해야 하잖아요..

만약 go f() 에서 f()의 반환값이 있을 때에는 위와 같은 코드가 자동으로 생성되어서 다음처럼 쓸수 이어도 좋을 것 같아요.

c := go longRunningTask()
// doing other task
use <-c here

컴파일러 입장에서는 쉽게 위의 코드를 자동 생성해줄 수 있으니까 어려운 일은 아닐 것 같네요. 

다만, Go의 설계 철학(doing more with less, be explicit, ..)에는 맞지 않을 것 같기도 하네요.

그냥 갑자기 생각나서 올려봅니다. 


Jaehyun Yeom

unread,
Sep 11, 2012, 11:51:08 AM9/11/12
to golang...@googlegroups.com

그러네요. 아직 제가 Go에 능통하지 않아서 확신은 안 서지만 좋은 syntactic sugar 같네요. 의미도 대략 분명해 보이고...

--
--
* 이 그룹에 이메일로 게시하려면 다음 주소로 이메일을 보내시면 됩니다.
golang...@googlegroups.com
* 추가 옵션을 보려면 http://groups.google.com/group/golang-korea?hl=ko?hl=ko의 그룹을 방문하세요.
 
 

Jongmin Kim

unread,
Sep 11, 2012, 12:07:06 PM9/11/12
to golang...@googlegroups.com
저도 간단한 goroutine 일 경우에는 호출 후 리턴값에 대한 대입이 있으면 채널 안 쓰고
편하겠다는 생각이 들긴 하더군요. 그런데 알고 있기로 happens before 등등 따지면서
컴파일러가 goroutine이나 channel 쓸 때 우선순위를 약간 조정하는 걸로 아는데
그러면 말씀하신대로 쉽게 구현이 들어갈 내용은 아니지 않을까 하는 생각이 듭니다.

그런데, 보통 이렇게도 많이 쓰시지 않나요??

c := longRunningTask()
use <-c here
`
func longRunningTask() (chan int) {
c := make(chan int)
go realLongRunningTask(c)
return c
}


2012년 9월 12일 수요일 오전 12시 51분 9초 UTC+9, 염재현 님의 말:

Jooyung Han

unread,
Sep 11, 2012, 6:43:21 PM9/11/12
to golang...@googlegroups.com
channel과 상관없는 함수의 경우에, 그 실행결과를 synchronous 하게 받을 것이냐, asynchronous 하게 받을 것인가라는 점에서, go가 반환값을 전달하는 채널을 반환해준다면, 호출 구문이 sync/async 간에 서로 비슷하게 되겠구나 하는 것이 처음 생각이었어요

c := f()
Use c

c := go f()
Use <-c

하지만, 그렇게 간단한 문제는 아닐 것 같네요. ㅎㅎ 


나의 iPhone4에서 보냄

2012. 9. 12. 오전 1:07 Jongmin Kim <atom...@gmail.com> 작성:

Jaeyoun Chung

unread,
Sep 17, 2012, 1:42:36 AM9/17/12
to golang...@googlegroups.com
spec에 보면 return값은 *무시*된다는 군요.

GoStmt = "go" Expression .

The expression must be a call. The function value and parameters are evaluated as usual in the calling goroutine, but unlike with a regular call, program execution does not wait for the invoked function to complete. Instead, the function begins executing independently in a new goroutine. When the function terminates, its goroutine also terminates. If the function has any return values, they are discarded when the function completes.


2012/9/12 Jooyung Han <jooyu...@gmail.com>

Jaehyun Yeom

unread,
Sep 17, 2012, 11:57:54 PM9/17/12
to golang...@googlegroups.com

네. 리턴 받을 때까지 기다리지 않는 거라서 지금 스펙에서는 리턴값이 무시되는데, 데이터를 받는 것과 관련된 채널을 리턴하는 걸로 약간의 신택틱 슈거 같은 게 있으면 어떨까 하는 의견이라 생각합니다.

근데 고 언어는 군더더기 최대한 안 붙이려는 언어라... 래핑 함수 하나 만들면 해결될 일이라면.. 안 넣을 것 같습니다.

Reply all
Reply to author
Forward
0 new messages