Golang 基础数据类型(二)
2008 年 11 月 10 日
强制类型数据转换
类型转换用于将一种数据类型的变量转换为另外一种类型的变量。Go语言类型转换的基本格式如下:
type_name(expression)
在做强制类型转换时,需要特别注意数据长度被截断而发生的 数据精度损失(比如将浮点型转换为整型) 与 值溢出(值超过转换目标类型的值范围时)。
func main() { num := 5 num1 := 11 num2 := float32(num) //把整型转换成浮点型 num3 := float32(num1) mean := num1 / num //原来的运算 mean1 := num3 / num2 //转换后的运算 fmt.Println("没有经过类型转换的值:", mean) fmt.Println("经过类型转换的值:", mean1) } /* 没有经过类型转换的值: 2 经过类型转换的值: 2.2 */
类型别名
类型别名是Go 1.9版本添加的新功能,主要用于解决代码升级、迁移中存在的类型兼容性问题(重构中常用)。
在前面数据类型的学习中,我们已经知道了byte类型是int8类型的别名,rune类型是int32的别名。 Go语言允许开发者自定义类型别名。
type ( //Go 1.9版本加入了类型别名的新特性 完满主任 string ) func main() { var b 完满主任 //自定义类型别名 b = "高举完满教育的伟大旗帜," fmt.Println(b) a := "坚持一百年完满教育不动摇" // fmt.Println(b + a) //编译报错,规定类型别名与原类型是两种不同的类型,但本质是一样的 fmt.Println(string(b) + a) //强制类型转换 } /* 高举完满教育的伟大旗帜, 高举完满教育的伟大旗帜,坚持一百年完满教育不动摇 */
指针
所有指针变量都是一个内存位置,每个内存位置都有其定义的地址,可以使用&运算符号,这个运算符表示内存中的地址。
使用指针基本上是三个步骤:
- 定义一个指针变量
- 将某个变量的值赋值给一个指针
- 最后访问指针变量中可用地址的值
指针数组
const MAX int = 3 //数组大小 func main() { var a *int //定义空指针a,指向nil aP := &a //定义空指针a的指针aP b := []int{10, 100, 200} //数组存储三个指向int型的值 var ptr [MAX] *int //声明 ptr 为指针数组,数组长度是MAX for i := 0; i < MAX; i++ { ptr[i] = &b[i] fmt.Printf("a[d]的地址:%x\n", i, ptr[i]) } for i := 0; i nil: %x\n", a) //打印空指针a的值,指向nil,为0 fmt.Printf("aP-->a: %x\n", aP) //打印指针aP的值,指向a fmt.Printf("aP-->a--nil: %x\n", *aP) // 打印指针aP指向的指针a的内存地址 fmt.Printf("&aP-->aP: %x\n", &aP) //打印aP在内存的地址 } /* a[d]的地址:0 %!(EXTRA *int=0xc0000123a0)a[d]的地址:1 %!(EXTRA *int=0xc0000123a8)a[d]的地址:2 %!(EXTRA *int=0xc0000123b0)a[0]的值是:a a[1]的值是:64 a[2]的值是:c8 a-->nil: 0 aP-->a: c000006028 aP-->a--nil: 0 &aP-->aP: c000006030 */ }
传递给函数
Go语言允许传递指针到 函数 中,只需将函数的参数声明为 指针类型 。
func main() { a := 100 b := 200 fmt.Printf("交换前a的值:%d\n", a) fmt.Printf("交换前b的值:%d\n", b) //把a和b的地址传递给函数,然后a和b的地址交换,实现两个值的交换 swap(&a, &b) fmt.Printf("交换后a的值:%d\n", a) fmt.Printf("交换后b的值:%d\n", b) } func swap(x *int, y *int) { //构造一个swap函数 var temp int temp = *x //存指针x的地址,自动推导指针类型 *x = *y //存指针y的地址 *y = temp //交换地址 } /* 交换前a的值:100 交换前b的值:200 交换后a的值:200 交换后b的值:100 */
欢迎关注我们的微信公众号,每天学习Go知识