For gosh sakes, don't make us read code with the scrutiny of a compiler :-) A type declaration after a function name is confusingly similar to an argument list.
Which witch is which?
func Stuff(type T Something)(input T) error { ... }
func Stuffed(input Somethingelse) error { ... }
C++ style is fine; variations on paren placement can be considered
(type T, U) Something // line break or semicolon
(type V) // more on next line
func Stuff(input T, more U, other V) error { ... }
And consider simple function aliases for callers
func TypedStuff Stuff(TypeA, TypeB, TypeC)
const TypedStuff = Stuff(TypeA, TypeB, TypeC) // alternatively
err = TypedStuff(x, y, z)
Well, my sentiment is a little harder: I like the 'simple' function signatures we have in Go today and don't like adding anything to them. Using the same bracket type twice is obviously making things harder to read and understand. So far we have
func
keywordEverything within one line. Looks complex enough for me. I hope we will end up with a solution which does not need any additions to the current function signatures. After all, our interfaces provide a similar complex functionality and they don't need any extra features within the function signatures either.