GO语言学习笔记(六):类型转换与指针

分类:
GO
标签:
基础
学习笔记
作者:
何鑫
创作时间:
2019/07/21 21:55:21

摘要:强制类型转换与指针介绍

强制类型转换

我们知道不同类型的变量是无法直接进行比较或运算的,比如int32与int64,虽然都是整型,但是是不能直接运算的,需要做类型转换。

package main

import "fmt"

func main() {
   var a int32 = 1
   var b int64 = 2
   // c = a + b 这是错误的,编译器会报类型不匹配错误
   d := int64(a) // 类型转换后即可运算
   c := b + d
   fmt.Println(c) // 输出3
}

在GO语言中没有隐式转换的概念,所有类型都是明确的,如果需要比较或运算,必须强制转换,格式是:要转换的类型(原值)。

需要注意的是,大转小可能会丢失精度。

类型别名

如SQL能给表定义别名一样,GO语言支持给类型定义别名,比如byte实际是int8类型别名,rune是int32类型别名。

在GO语言中,用type来定义别名。

package main

import "fmt"

type 字符串 string // 定义字符串为string类型别名

func main() {
   var a 字符串 = "哈哈"
   fmt.Println(a)
}

注意:定义别名之后与原类型实际是两个类型,所以不能直接比较运算,需要进行类型转换。

指针

指针是个比较重要的概念,它指的是一个内存位置,在传递参数是,如果原参数占用内存较大,传递指针往往会更内存,更高效(因为指针表示内存地址的长十六进制数)。

指针变量声明是在原类型前加一个*号,例如:

package main

import "fmt"


func main() {
   var a *int // 声明int类型的指针
   b := 20 // 声明b并赋值为20,此时b被推导为int型
   a = &b // 将b的地址付给指针a
   fmt.Println(a) // 打印0xc000064080
}

相比于C语言,GO语言指针是弱化的指针,不能进行指针运算。

指针通过*来获取指针对应的值,也可以改变指针对应的值:

package main

import "fmt"


func main() {
   b := 20
   a := &b
   fmt.Println(a) // 输出0xc000064080
   fmt.Println(*a) // 输出20
   *a = 30 // 把a指针对应的值变为30
   fmt.Println(b) // 输出30
}

如果仅声明一个指针变量而不赋值,那么这个指针的默认值会是nil,nil是指为0的常量,表示指针不指向任何地址。

发表评论

温馨提示: 评论先审核后发布, 请勿发表不良言论

所有评论