Well my almost-use-case was just for signaling without assignment. The assignment cases are something that would need to be addressed by such a feature. I like your pattern as a Go 1 solution, but what are the unaddressed concerns?
Thanks for the feedback, happy holidays. Matt On Sunday, December 24, 2017 at 12:41:04 PM UTC-6, Michael Jones wrote: > > Many important concerns are unaddressed here. > > Inside the clause of a "v1 := <-c1" the identifier v1 has meaning -- it is > the value by which one refers to the successful receipt. > > Inside the clause of a "v1, ok1 := <-c1" v1 is either the value received > when ok1 is true or the zero value of the type when ok1 is false. > > Having multiple vNs and one Ok feels improper to me. > > > > How about this as a way to do the "grouped response metaphor" you seek: > > var v1, v2, ... vN appropriateValueTypes for channels c1..cN > var ok1, ok2, ... okN bool > > // do the select with all case bodies empty > select { > case v1,ok1 = <- c1: > case v2,ok2 = <- c2: > : > case vN,okN = <- cN: > } > > // decode the select > switch { > case ok1, ok2: > // common stuff coded once > case okN: > // solo stuff > } > > > > On Fri, Dec 22, 2017 at 7:36 AM, <matthe...@gmail.com <javascript:>> > wrote: > >> David, >> >> There's a good argument for not spending time adding this to the spec and >> compilers: there are bigger issues for the existing language developers. >> >> Jason, >> >> I've suggested the non-receiving assignment is set to the zero value, ok >> only applies to the receiving assignment and can be used twice since both >> are bool, and yes there are a lot of commas. Perhaps there could be special >> syntax for the multiple ok: >> >> select{ >> case x := <-c1, y := <-c2, (ok): >> // ok is for whichever is assigned or closed >> } >> >> Maybe living with the commas isn't too bad: >> >> select{ >> case x, ok := <-c1, y, ok := <-c2, z, ok := <-c3: >> // ok is for whichever is assigned or closed >> } >> >> Or how about ;? Two examples: >> >> select{ >> case x, ok := <-c1; y, ok := <-c2: >> if ok == false { >> return >> } >> if x != false { >> fmt.Println("true on c1") >> break >> } >> fmt.Printf("non-zero %v on c2\n", y) >> case x, ok := <-c3; y, ok := <-c4: >> if ok == false { >> return >> } >> if x != 0 { >> fmt.Println(x) >> } else { >> fmt.Println(y) >> } >> continue >> case c5<-v1; c6<-v2; c7<-v3: >> break OUTER >> } >> >> select{ >> case x, ok := <-c1 >> y, ok := <-c2: >> if ok == false { >> return >> } >> if x != false { >> fmt.Println("true on c1") >> break >> } >> fmt.Printf("%v on c2\n", y) >> case x, ok := <-c3 >> y, ok := <-c4 >> z := <-c8: >> if ok == false { >> return >> } >> if x != 0 { >> fmt.Println(x) >> } else if y != nil { >> fmt.Println(y) >> } else { >> fmt.Println(z) >> } >> continue >> case c5<-v1 >> c6<-v2 >> c7<-v3: >> break OUTER >> } >> >> ok would be set to true if the receiving assignment does not assign it >> but other parallel assignments have it. >> >> Matt >> >> >> On Friday, December 22, 2017 at 12:44:03 AM UTC-6, Jason Phillips wrote: >>> >>> Matt, >>> >>> Would that mean that other receive expression(s) yield the zero value? >>> >>> select { >>> case x := <-c1, y := <-c2: >>> // If a value is received from c1, is y the zero value? >>> } >>> >>> Would the multi-valued assignment form of the receive operator gain an >>> additional meaning? >>> >>> select { >>> case x, ok := <-c1, y := <-c2: >>> // If a value is received from c2, does "ok" designate unsuccessful >>> receive or channel close? >>> } >>> >>> Additionally, the commas become awfully confusing with multiple >>> multi-valued assignments: >>> >>> select { >>> case x, ok1 := <-c1, y, ok2 := <-c2: >>> // Do something >>> } >>> >>> >>> Jason >>> >>> On Thursday, December 21, 2017 at 2:38:02 PM UTC-5, matthe...@gmail.com >>> wrote: >>>> >>>> I would assume only one would send/receive out of the comma list for a >>>> case to be executed. >>>> >>>> Matt >>>> >>>> On Thursday, December 21, 2017 at 12:32:22 PM UTC-6, Jason Phillips >>>> wrote: >>>>> >>>>> With a multiple expression switch statement, the associated case is >>>>> executed if any expression is equal to the switch expression. For a >>>>> multiple expression select, would all channel expressions have to proceed >>>>> for the associated case to execute? >>>>> >>>>> e.g. >>>>> >>>>> select { >>>>> case x := <-c1, y := <-c2: >>>>> // is it guaranteed that both c1 and c2 have produced a value, or >>>>> just one or the other? >>>>> } >>>>> >>>>> What about send operations? >>>>> >>>>> select { >>>>> case c1 <- 10, c2 <- 20: >>>>> // is this only executed if both sends happened? >>>>> } >>>>> >>>>> >>>>> Jason >>>>> >>>>> On Thursday, December 21, 2017 at 9:04:35 AM UTC-5, >>>>> matthe...@gmail.com wrote: >>>>>> >>>>>> First the switch behavior surprised me when looking at how to stack >>>>>> cases, but then later I was surprised that select doesn't have the same >>>>>> thing. Consistency is the only reason to write it down, my concrete >>>>>> example >>>>>> doesn't need this as shown by Damien in the proposal. >>>>>> >>>>>> Matt >>>>>> >>>>>> On Wednesday, December 20, 2017 at 6:51:36 PM UTC-6, Rob 'Commander' >>>>>> Pike wrote: >>>>>>> >>>>>>> There is no particular reason, it was just to keep things simple, if >>>>>>> it was even talked about. I don't think it was. >>>>>>> >>>>>>> If you want to propose a change, now is a good time to do that. Not >>>>>>> sure the idea is above the bar, though. >>>>>>> >>>>>>> -rob >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> On Thu, Dec 21, 2017 at 9:39 AM, <matthe...@gmail.com> wrote: >>>>>>> >>>>>>>> Tracker proposal for this: >>>>>>>> https://github.com/golang/go/issues/23196 >>>>>>>> >>>>>>>> Matt >>>>>>>> >>>>>>>> On Monday, December 18, 2017 at 10:11:02 AM UTC-6, >>>>>>>> matthe...@gmail.com wrote: >>>>>>>>> >>>>>>>>> I guess with select you can't do the comma for multiple cases >>>>>>>>> having one behavior like with switch: >>>>>>>>> >>>>>>>>> select{ >>>>>>>>> case <-c1, <-c2: // gofmt: expected 1 expression >>>>>>>>> fmt.Println("c1 or c2") >>>>>>>>> case <-c3: >>>>>>>>> } >>>>>>>>> >>>>>>>>> switch s{ >>>>>>>>> case v1, v2: >>>>>>>>> fmt.Println("v1 or v2") >>>>>>>>> case v3: >>>>>>>>> } >>>>>>>>> >>>>>>>>> I assume this is because select cases have an optional var >>>>>>>>> assignment. This would have been nice for detecting an explicit >>>>>>>>> client >>>>>>>>> cancel action versus a w.(http.CloseNotifier).CloseNotify() where the >>>>>>>>> resulting server action is the same. >>>>>>>>> >>>>>>>>> Matt >>>>>>>>> >>>>>>>> -- >>>>>>>> You received this message because you are subscribed to the Google >>>>>>>> Groups "golang-nuts" group. >>>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>>> send an email to golang-nuts...@googlegroups.com. >>>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>>> >>>>>>> >>>>>>> -- >> You received this message because you are subscribed to the Google Groups >> "golang-nuts" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to golang-nuts...@googlegroups.com <javascript:>. >> For more options, visit https://groups.google.com/d/optout. >> > > > > -- > Michael T. Jones > michae...@gmail.com <javascript:> > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.