4 ms·
I admit the syntax is less than ideal (especially with gofmt), but I believe adding two interfaces to an interface definition is equivalent to union: func
by infogulch 10y ago
I admit the syntax is less than ideal (especially with gofmt), but I believe adding two interfaces to an interface definition is equivalent to union:
func myrw(rw interface { io.Reader; io.Writer }) {
rw.Read(nil)
rw.Write(nil)
}
https://play.golang.org/p/D-lJ1pL3MZ https://play.golang.org/p/D-lJ1pL3MZ
- deleted 10y ago[deleted]
- hiker 10y agoNot really, it's equivalent to a product type.
- deleted 10y ago[deleted]
- realharo 10y agoThat would be similar to an intersection type (https://www.typescriptlang.org/docs/handbook/advanced-types.html https://www.typescriptlang.org/docs/handbook/advanced-types....), but due to the way Go works, it cannot contain duplicates, and it doesn't work for structs. Union type is "it can be one of these types", and you can then access only fields/methods that all of those types share (unless you cast them of course). The naming can be a bit counter-intuitive.
- camus2 10y agoThat's not a union, that's a product of 2 types. A union is one or the other but not both. You rw here is both a reader and a writer, you can't pass something that is either a reader or a writer, which makes your snippet useless in use-cases where unions are appropriate. Of course, Go compiler itself uses "unions" with runtime-tricks to implement them. But we're talking about runtime then, not compile time type safety and correctness.