go笔记 - 类型转换

2020-10-09  本文已影响0人  陈德华

go 存在 4 种类型转换分别为:断言、强制、显式、隐式。

通常说的类型转换是指断言,强制在日常不会使用到、显示是基本的类型转换、隐式使用到但是不会注意到。断言、强制、显式三类在 go 语法描述中均有说明,隐式是在日常使用过程中总结出来。

1、断言通过判断变量是否可以转换成某一个类型

(1)使用断言表达式

文档地址

var s = x.(T) 或 s, ok := x.(T),注意第一种断言失败会直接panic,开发中尽量使用第二种

例:

var x interface{} = 7          // x has dynamic type int and value 7

i, ok := x.(int)                  // i has type int and value 7

if ok {

    // 成功

}

(2)switch

文档地址

例:

switch i := x.(type) {

case nil:

    printString("x is nil")                // type of i is type of x (interface{})

case int:

    printInt(i)                            // type of i is int

case float64:

    printFloat64(i)                        // type of i is float64

default:

}

2、强制类型转换

强制类型转换通过修改变量类型,通常使用unsafe。文档地址

var f float64

bits = *(*uint64)(unsafe.Pointer(&f))

type ptr unsafe.Pointer

bits = *(*uint64)(ptr(&f))

var p ptr = nil

3、显示类型转换

文档地址

注意要满足以下要求:

x 可以分配成 T 类型。

忽略 struct 标签 x 的类型和 T 具有相同的基础类型。

忽略 struct 标记 x 的类型和 T 是未定义类型的指针类型,并且它们的指针基类型具有相同的基础类型。

x 的类型和 T 都是整数或浮点类型。

x 的类型和 T 都是复数类型。

x 的类型是整数或 [] byte 或 [] rune,并且 T 是字符串类型。

x 的类型是字符串,T 类型是 [] byte 或 [] rune。

例:

uint(iota)              // iota value of type uint

float32(2.718281828)    // 2.718281828 of type float32

complex128(1)            // 1.0 + 0.0i of type complex128

float32(0.49999999)      // 0.5 of type float32

float64(-1e-1000)        // 0.0 of type float64

string('x')              // "x" of type string

string(0x266c)          // "♬" of type string

MyString("foo" + "bar")  // "foobar" of type MyString

string([]byte{'a'})      // not a constant: []byte{'a'} is not a constant

(*int)(nil)              // not a constant: nil is not a constant, *int is not a boolean, numeric, or string type

int(1.2)                // illegal: 1.2 cannot be represented as an int

string(65.0)            // illegal: 65.0 is not an integer constant

4、隐式类型转换

5、数字类型,可以保证以下大小对其:

type                                size in bytes

byte, uint8, int8                               1

uint16, int16                                    2

uint32, int32, float32                       4

uint64, int64, float64, complex64    8

complex128                                   16

上一篇下一篇

猜你喜欢

热点阅读