go语言是强类型的语言,所以类型转换是必不可少的。Go语言要求表达式的不同的类型之间必须做显示的类型转换;不过Go语言必须做显示的类型转换的要求也有例外的情况:
当普通T类型变量向I接口类型转换时是隐式的;
当IX接口变量向I接口类型转换可以在编译期完成时是隐式的;
类型转换表达式T(x)
T(x) 用于把变量x转换为T类型;非常量值x能转换为T需要满足:
x能赋值给T类型;
x的类型与T有相同的底层类型(underlying type);
x的类型与T都是未命名的指针类型,切指针基于的类型是相容的;
x的类型与T都是整数类型,或浮点类型;
x的类型与T都是复数类型;
x是数字或byte/rune的切片,T为string;
x是string类型,T为byte/rune的切片;
x需要转换为T类型的语法是T(x).
*Point(p) // same as*(Point(p))
(*Point)(p) // p is converted to *Point
(
func()(x) // function signature func() x
(func())(x) // x is converted to func()
(func() int)(x) // x is converted to func() int
func() int(x) // x is converted tofunc() int (unambiguous)
还有一个容易混淆的地方是 只读通道(
接口interface{}类型转换
interface{}可用于向函数传递任意类型的变量,在函数内部使用时需要通过类型断言来提取指定的明确类型的值。
v, ok := value.(typeName)
转换成功,结果v拥有静态类型 typeName 的新值;失败,ok返回false。
v= value.(typeName)转换失败是会抛出恐慌。
func VarType(info interface{}){
// ifv, ok := info.(int); ok{
//fmt.Println("int: ", v)
//result = v
// }else if v, ok := info.(string); ok{
//fmt.Println("string: ", v)
// }else {
//fmt.Printf("%v\n", info)
// }
// 直接通过switch-type判断
switchv := info.(type){
case int: fmt.Println("int: ", v)
case string: fmt.Println("string: ", v)
default: fmt.Printf("Deufalt: %v\n", info)
}
}
string与基本类型间转换strconv
strconv包中实现基本类型与string间的互相转换。包括四类函数:
Append 类:如 AppendBool(dst []byte, b bool)[]byte,将值转化后添加到[]byte的末尾
Format 类,例如FormatBool(b bool) string,将bool float int uint 类型的转换为string,FormatInt的缩写为Itoa
Parse 类,例如ParseBool(str string)(value bool, err error) 将字符串转换为 bool float int uint类型的值,err指定是否转换成功,ParseInt的缩写是Atoi
Quote 类,对字符串的 双引号 单引号 反单引号 的操作
数字与字符串间转换:
i, err := strconv.Atoi("-42")
s := strconv.Itoa(-42)
b, err := strconv.ParseBool("true")
f, err := strconv.ParseFloat("3.1415", 64)
i, err := strconv.ParseInt("-42", 10, 64)
u, err := strconv.ParseUint("42", 10, 64)
s := strconv.FormatBool(true)
s := strconv.FormatFloat(3.1415, 'E', -1, 64)
s := strconv.FormatInt(-42, 16)
s := strconv.FormatUint(42, 16)
字符串转换quote:将字符串转换为双引号引起的字符串(特殊字符串替换为转移字符):
strconv.Quote(`C:\Windows`) // "C:\\Windows"
strconv.QuoteToASCII("Hello 世界!") // "Hello \u4e16\u754c\uff01"
转换函数:
func AppendBool(dst []byte, b bool) []byte
func AppendFloat(dst []byte, f float64, fmt byte, prec, bitSize int) []byte
func AppendInt(dst []byte, i int64, base int) []byte
func AppendQuote(dst []byte, s string) []byte
func AppendQuoteRune(dst []byte, r rune) []byte
func AppendQuoteRuneToASCII(dst []byte, r rune) []byte
func AppendQuoteRuneToGraphic(dst []byte, r rune) []byte
func AppendQuoteToASCII(dst []byte, s string) []byte
func AppendQuoteToGraphic(dst []byte, s string) []byte
func AppendUint(dst []byte, i uint64, base int) []byte
func Atoi(s string) (int, error)
func CanBackquote(s string) bool
func FormatBool(b bool) string
func FormatFloat(f float64, fmt byte, prec, bitSize int) string
func FormatInt(i int64, base int) string
func FormatUint(i uint64, base int) string
func IsGraphic(r rune) bool
func IsPrint(r rune) bool
func Itoa(i int) string
func ParseBool(str string) (bool, error)
func ParseFloat(s string, bitSize int) (float64, error)
func ParseInt(s string, base int, bitSize int) (i int64, err error)
func ParseUint(s string, base int, bitSize int) (uint64, error)
func Quote(s string) string
func QuoteRune(r rune) string
func QuoteRuneToASCII(r rune) string
func QuoteRuneToGraphic(r rune) string
func QuoteToASCII(s string) string
func QuoteToGraphic(s string) string
func Unquote(s string) (string, error)
func UnquoteChar(s string, quote byte) (value rune, multibyte bool, tail string, err error)
领取专属 10元无门槛券
私享最新 技术干货