有没有办法在golang中用不安全的指针实现这个整数转换函数?
Is there a way to implement this integer casting function with unsafe Pointer in golang?
我想知道我是否可以实现此功能的更简洁的版本。如果能有更好的性能就好了
func AnyIntToInt(x interface{}) (int, error) {
switch val := x.(type) {
case int8:
return int(val), nil
case int16:
return int(val), nil
case int32:
return int(val), nil
case int64:
return int(val), nil
case uint8:
return int(val), nil
case uint16:
return int(val), nil
case uint32:
return int(val), nil
case uint64:
return int(val), nil
}
return 0, ErrNotInteger
}
我一直在尝试这个,但是它产生了意想不到的结果。
func AnyIntToInt(x interface{}) (int, error) {
return *(*int)(unsafe.Pointer(&x))
}
问题中的代码是可行的方法,但您可以使用 reflect 包减少代码行数:
func AnyIntToInt(x interface{}) (int, error) {
v := reflect.ValueOf(x)
switch v.Kind() {
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
return int(v.Int()), nil
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
return int(v.Uint()), nil
}
return 0, ErrNotInteger
}
我想知道我是否可以实现此功能的更简洁的版本。如果能有更好的性能就好了
func AnyIntToInt(x interface{}) (int, error) {
switch val := x.(type) {
case int8:
return int(val), nil
case int16:
return int(val), nil
case int32:
return int(val), nil
case int64:
return int(val), nil
case uint8:
return int(val), nil
case uint16:
return int(val), nil
case uint32:
return int(val), nil
case uint64:
return int(val), nil
}
return 0, ErrNotInteger
}
我一直在尝试这个,但是它产生了意想不到的结果。
func AnyIntToInt(x interface{}) (int, error) {
return *(*int)(unsafe.Pointer(&x))
}
问题中的代码是可行的方法,但您可以使用 reflect 包减少代码行数:
func AnyIntToInt(x interface{}) (int, error) {
v := reflect.ValueOf(x)
switch v.Kind() {
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
return int(v.Int()), nil
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
return int(v.Uint()), nil
}
return 0, ErrNotInteger
}