go语言中变量和常量的注意点
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
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)
}