mirror of
https://github.com/gopl-zh/gopl-zh.github.com.git
synced 2024-11-28 17:19:06 +00:00
45 lines
1.2 KiB
Go
45 lines
1.2 KiB
Go
// Copyright © 2016 Alan A. A. Donovan & Brian W. Kernighan.
|
|
// License: https://creativecommons.org/licenses/by-nc-sa/4.0/
|
|
|
|
// See page 332.
|
|
|
|
// Package format provides an Any function that can format any value.
|
|
//!+
|
|
package format
|
|
|
|
import (
|
|
"reflect"
|
|
"strconv"
|
|
)
|
|
|
|
// Any formats any value as a string.
|
|
func Any(value interface{}) string {
|
|
return formatAtom(reflect.ValueOf(value))
|
|
}
|
|
|
|
// formatAtom formats a value without inspecting its internal structure.
|
|
func formatAtom(v reflect.Value) string {
|
|
switch v.Kind() {
|
|
case reflect.Invalid:
|
|
return "invalid"
|
|
case reflect.Int, reflect.Int8, reflect.Int16,
|
|
reflect.Int32, reflect.Int64:
|
|
return strconv.FormatInt(v.Int(), 10)
|
|
case reflect.Uint, reflect.Uint8, reflect.Uint16,
|
|
reflect.Uint32, reflect.Uint64, reflect.Uintptr:
|
|
return strconv.FormatUint(v.Uint(), 10)
|
|
// ...floating-point and complex cases omitted for brevity...
|
|
case reflect.Bool:
|
|
return strconv.FormatBool(v.Bool())
|
|
case reflect.String:
|
|
return strconv.Quote(v.String())
|
|
case reflect.Chan, reflect.Func, reflect.Ptr, reflect.Slice, reflect.Map:
|
|
return v.Type().String() + " 0x" +
|
|
strconv.FormatUint(uint64(v.Pointer()), 16)
|
|
default: // reflect.Array, reflect.Struct, reflect.Interface
|
|
return v.Type().String() + " value"
|
|
}
|
|
}
|
|
|
|
//!-
|