1、类型转换:大类型可以转换成小类型但是精度丢失;小类型不能转换成大类型。例如:
package main
import "fmt"
//golang中使用" var "关键字来定义变量
//定义变量的语法:1、var var_name1[,var_name2,...] var_type (只声明变量,不进行赋值,使用默认值)
// 2、var var_name var_type = var_value
// 3、var var_name = var_value
// 4、var_name := var_value
//var var_name1[,var_name2,...] [var_type] = var_value1[,var_value2,...]
func main() {
var a = 3.14
b := int(a) //将浮点型转换成整型。
fmt.Println(b)
}
2、rune类型的变量:rune和int32等价,rune相当于int32类型的重新封装,是对int32使用场景的特殊化,rune主要用于处理unicode以及utf-8字符。goland中string底层是通过byte数组实现的。中文字符在unicode编码中占2个字节;在utf-8编码中占3个字节,而golang默认编码为utf-8。如果将中文字符串转换成rune类型,则中文也只算一个字节。例如:
package main
import "fmt"
func main() {
var str = "hello 你好"
fmt.Println("len1:", len(str))
//汉字在unicode编码中占两个字节,在utf8编码中占三个字节;go的默认编码是utf8编码
//将字符串转换成rune类型,汉字也只占一个字节,转换完之后就成一个数组类型了;go中string底层是通过byte数组实现的
fmt.Println("len2:", len([]rune(str)))
}
3、常量的定义:golang中使用" const "关键字来定义常量,例如:
package main
import (
"fmt"
"unsafe"
)
//常量定义语法:const const_name1[,const_name2,...] [const_type] = const_value1[,const_value2,...]
func main() {
//使用枚举格式定义常量
const (
a = "abc"
b = len(a) //求字符串长度的内置函数
c = unsafe.Sizeof(a) //该函数表示计算常量a的内存大小
)
fmt.Println(a, b, c)
}
golang中unsafe.Sizeof()函数:
1>、对不同长度的字符串,unsafe.Sizeof()函数的返回值都是16,这是因为string类型对应一个结构体,该结构体有两个域,第一个域指向该字符串的指针,第二个域为字符串的长度,每个域占8个字节,但是并不包含指针指向的的字符串的内容,因此unsafe.Sizeof()函数的返回值始终是16。
2>、对不同长度的数组,unsafe.Sizeof()函数的返回值随着数组中元素的个数的增加而增加,这是因为unsafe.Sizeof()函数总是在编译期就进行求值,而不是在运行时,这就意味着unsafe.Sizeof()函数的返回值可以赋值给常量,在编译期求值,意味着可以获得数组所占的内存大小,因为数组总是在编译期就指明自己的容量,并且在以后都是不可变的。
3>、对所含元素个数不同的切片,unsafe.Sizeof()函数的返回值都是24,这是因为对切片来说unsafe.Sizeof()函数返回的值对应的是切片的描述符,为不是切片所指向的内存的大小,因此都是24。
4、iota类型的常量:iota是一种特殊的常量,可以认为是一个可以被编译器修改的常量。iota常量的特点:
1>、iota在const关键字出现时将被重置为0。
2>、const中每新增一行常量声明将使iota计数一次(iota可理解为const语句块中的行索引)。
例如:
package main
import "fmt"
func main() {
//枚举格式中,如果一个常量不重新赋值,则该常量的值就是上一个常量的值
//"_":表示丢弃该值,常用在错误处理
const (
a = iota //iota+1
b //iota+1
c //iota+1
_ //iota+1
d = "hc" //iota+1
e //iota+1
f = 100 //iota+1
g //iota+1
h = iota //iota+1
)
fmt.Println(a, b, c, d, e, f, g, h)
}