It avoids confusion AND silent errors. Imagine you have:

func f() (int, int)
func g() (int, int)
func h(int, int, int, int) int

And somewhere in your code this line appears:

v = h(f(), g())

But for some reason, someday you need to change your code and now your
function f and g have the following signature:

f() int
g() (int, int, int)

Then if what you suggest was allowed, the line

v = h(f(), g())

would still compile --> h takes four arguments, and f and g have a total
number of return values of 4. However, there has been a major change in the
way things work: do you really want your compiler to say nothing and keep
doing its thing? I don't think so. Moreover, in a real project, there's
only a small chance f, g and h are in the same file (or package), which
makes it even likelier that you will never see this (silent) error.

Hope this helps!

Le mer. 7 août 2019 à 17:09, <howardcs...@gmail.com> a écrit :

> On Wednesday, August 7, 2019 at 8:45:18 AM UTC-5, lgo...@gmail.com wrote:
>>
>> f( g() ) compiles  when g returns exactly the number of args that f()
>> requires, but if g() returns only 1/2 that number  f (g(), g() ) wont
>> compile !! ...Is this not a Golang absurdity  ??
>>
>>>
>>>
> Eh. Certainly absurd from the perspective of a lot of languages, and
> frustrating when put up against the otherwise good support for duck-typing.
> But the sharp limitation of 'magic' in syntax and the emphasis on being
> explicit where there might be  ambiguity seems in line with Go's ethos to
> me.
>
> At any rate, you can do almost this, if you really, really want to for
> some reason.
> https://play.golang.org/p/90gx-tHXwq5
>
> It would be f(h(g,g)) instead of f(g(),g()), but if you had some situation
> where you legitimately needed to make the call a lot, maybe it might be
> worth it over putting the variable collection in each call site.
>
> On the whole, though, it really seems like trying to shoehorn a different
> language's behavior into Go, and maybe you might be better off just finding
> a different way to express the pattern.
>
> For example, instead of returning x and y from your scalarmult(scale, x,
> y) function, you could use a Point struct.
>
> https://play.golang.org/p/V1Iw5HUK4e_-
>
> type Point struct {
> x, y int
> }
>
> func scalarMult(scale int, a Point) Point {
> return Point{a.x*scale,a.y*scale}
> }
>
> func add(a Point, b Point) Point {
> return Point{a.x+b.x,a.y+b.y}
> }
>
> func main() {
> m1 := scalarMult(16,Point{28,33})
> m2 := scalarMult( 1,Point{28,33})
> r := add(m1, m2)
> fmt.Println(r)
> }
>
> {476 561}
>
>
> Howard
>
> --
> 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.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/golang-nuts/9efbd578-8258-4d5f-a47a-5ac72ea609aa%40googlegroups.com
> <https://groups.google.com/d/msgid/golang-nuts/9efbd578-8258-4d5f-a47a-5ac72ea609aa%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>

-- 
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.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CANgi337b0RYZDXaFjjmHhwktud4qVw1wFioftTUYizxaOL1oZA%40mail.gmail.com.

Reply via email to