Quoting roger peppe (2018-11-25 12:01:08) > On Sun, 25 Nov 2018 at 16:54, 'Axel Wagner' via golang-nuts > <[1]golang-nuts@googlegroups.com> wrote: > > I'd suggest simply > func (b *Binlog) writeArgumentToOutput(writer writer, arg uint64) error > { /* do the writing */ } > and doing the actual conversions at the call-site. It's type-safe, > shorter, faster and more idiomatic - with the tiny downside of a > `uint64()` here and there. > Alternatively, use reflect as it's intended to - something like > func� writeArgumentToOutput(writer writer, arg interface{}) error { > � � rv := reflect.ValueOf(arg) > � � var v uint64 > � � if k := rv.Kind(); k >= reflect.Int && k < reflect.Uint { > > I know constants are protected by the Go compatibility guarantee, doing > range comparisons on reflect.Kind constants seems a bit dubious to me. > Without going to the definitions, it's not clear to the reader which > exact kinds are included here. I'd suggest enumerating all the expected > kinds directly in a switch statement (the compiler may well optimize to > a range comparison for that anyway).
I agree; had to stare at this a bit. Something like: switch rv.Kind() { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: v = uint64(rv.Int()) case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: v = rv.Uint() default: return fmt.Errorf("Unsupported type: %T\n", reflect.TypeOf(arg)) } Only slightly more verbose, but much easier to understand. But ultimate Axel's first instinct is I think the right one -- just do the cast at the call site. -- 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.