go类型转换断言与转换

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)

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180821G1NPRY00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券