package main import ( "errors" "fmt" ) func doubler(v interface{}) (string, error) { switch t := v.(type) { case string: return t + t, nil case bool: if t { return "truetrue", nil } return "falsefalse", nil case float32, float64: if f, ok := t.(float64); ok { return fmt.Sprint(f * 2), nil } return fmt.Sprint(t.(float32) * 2), nil case int: return fmt.Sprint(t * 2), nil case int8: return fmt.Sprint(t * 2), nil case int16: return fmt.Sprint(t * 2), nil case int32: return fmt.Sprint(t * 2), nil case int64: return fmt.Sprint(t * 2), nil case uint: return fmt.Sprint(t * 2), nil case uint8: return fmt.Sprint(t * 2), nil case uint16: return fmt.Sprint(t * 2), nil case uint32: return fmt.Sprint(t * 2), nil case uint64: return fmt.Sprint(t * 2), nil default: return "", errors.New("unsupported type passed") } } func main() { res, _ := doubler(-5) fmt.Println("-5: ", res) res, _ = doubler(5) fmt.Println("5: ", res) res, _ = doubler("yum") fmt.Println("yum: ", res) res, _ = doubler(true) fmt.Println("true:", res) res, _ = doubler(float32(3.14)) fmt.Println("3.14:", res) }