go语言中变量和常量的注意点

文章介绍了Golang中的类型转换规则,如大类型可以转换成小类型但可能丢失精度,小类型不能直接转大类型。同时讲解了rune类型用于处理Unicode和UTF-8字符,以及字符串到rune的转换。还讨论了常量的定义,包括使用`const`关键字和`iota`枚举常量。另外,提到了`unsafe.Sizeof`函数在不同数据类型上的应用。
摘要由CSDN通过智能技术生成

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)
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值