Go语言_变量

变量

变量的定义、赋值和使用

var i int // var 变量名 数据类型
var j float32
i = 10
fmt.Println(i)

注意事项:

  • 指定变量类型,声明后如果不赋值则使用默认值(int 默认值为0)
  • 如果不指定变量类型,根据值自行判定变量类型(类型推导)
  • 省略var关键字,可以使用:=号来声明变量并进行赋值
var i int 
i = 10
// 等价于
i := 10 // 类型推导,无需指定变量类型

一次性声明多个变量:

var n1,n2,n3 int // 一次性声明三个变量
var n1,name,n3 = 100,"tom",1000
n1,name,n3 := 100,"tom",1000 // 类型推导,无需指定变量类型

全局变量的声明:

​ 在go中在函数外声明的变量都是全局变量

// 一次性定义多个全局变量
var n4 = 300
var n5 = 500
var (n1 = 300
    n2 = 400
    name = "go"
)
func main(){
    
}

注意事项:

  • 在同一作用域内变量的数据类型不能被改变,但是可以强转之后复制给其他类型变量

  • 变量在同一个作用域内不能重名,不能重复定义

  • 变量的三要素:变量名、变量值、数据类型

  • 默认值:如果变量没有赋初值,编译器会使用默认值,如int为0,字符串为空,浮点类型为0,布尔值为false

基本数据类型

  1. 数值型

整数类型

int int8 int16 int32 int64(uint无符号)

​ int 在32位os中是32位,在64位os中是64位

rune类型,等价于int32,其表示一个unicode

// 使用rune类型来存储中文
var name rune = '中'
// 通过Printf来格式化输出
fmt.Printf("%c", name)

浮点类型浮点值的类型默认为float64

float32 float64

  1. 字符型

​ 没有专门的字符型,使用byte来保存单个字符

​ 注意事项:

  • byte等价于uint8
  • 字符常量通过单引号来表示,双引号会报错。
  • go语言中编码采用utf-8编码。
  • 如果不使用格式化输出(Printf)而使用(Println)输出则直接输出UTF-8码值。
  • 字符类型是可以直接进行运算,相当于一个整数(码值)
  1. 布尔类型(默认为false

​ 只能取true或者false,占一个字节

  1. 字符串类型

​ 字符串是固定长度的字符连接起来的字符序列,go中的字符串由字节组成。

​ Go语言的字符串的字节使用UTF-8编码来表示Unicode字符

​ 注意事项

  • Go中字符串不可变,一旦赋值之后不能被修改
  • 字符串中的表示形式
    • 双引号:有转义符会识别
    • 反引号:以字符串的原生形式输出,包括换行和特殊字符
  • 通过+号可以实现字符串的拼接,换行拼接需要把+留在上面一行

派生/复杂数据类型

  1. 指针
  2. 数组
  3. 结构体(struct)
  4. 管道
  5. 函数
  6. 切片
  7. 接口
  8. map类型

查看数据类型和变量所占用字节数

import (
	"fmt"
	"unsafe"
)
func main() {
// 通过Printf格式化输出函数 来查看数据类型
var chr byte = 'a'
fmt.Printf("%c,%T", chr, chr) // 格式化输出chr(以字符输出),并查看数据类型
/*
output:a,uint8
*/
// 通过unsafe包中的Sizeof方法可以获取到变量的占用的字节数
fmt.Printf("chr 占用的字节数:%d",unsafe.Sizeof(chr)) 
/*
chr 占用的字节数:1
*/
}

基本数据类型的转换

Go中的数据类型需要显示转换(强转)

必须要需要强制转换,所以两个变量在进行运算时需要注意变量类型是否匹配。

转换的基本语法:T(v),将值v转化为T类型,低精度向高精度转换同样需要。

var i int32 = 100
var j float32 = float32(i)
var k int64 = int64(i)

注意事项:

  • 被转换的是变量存储的数据(值),但是变量本身的数据类型并没有变化
  • 在转换时,从int64转化为int8时,编译不会报错,但是会进行截断。
  • 在进行除法运算时,**如果两个整数相除,则结果默认取整,**如果需要保留小数,则需要对除数和被除数进行类型强制转换。
var intArr1 [5]int = [5]int{1, 33, 3, 45, 16}
sum := 0
for _, val := range intArr1 {
    sum += val
}
fmt.Println(sum, float64(sum)/float64(len(intArr1)))

基本类型转化

基本数据类型转string

  • 通过fmt.Sprinf()方法转换

​ 返回转化后的字符串

	var iii int = 32
	str = fmt.Sprintf("%d", iii)
	fmt.Printf("%T", str)
  • 通过strconv包中的函数
var iii int = 32
str = fmt.Sprintf("%d", iii)
fmt.Printf("%T", str)
str2 = strconv.FormatInt(int64(iii), 10) // 将10进制的iii转化成字符串
fmt.Println(str)
// FormatFloat(floatnums,'f',10,64):将floatnums这个64位的小数值转化成字符串,小数保留10位,输出格式为f(还可以以e,科学计数法方式输出)
// FormatBool()
// Itoa(int),接收int类型,数字转string

string转基本数据类型

  • 使用strconv包中下面四个函数来进行转换

​ 返回值是两个,一个是值还一个错误变量。

注意事项:

​ String转基本数据类型:

  • 需要确保string可以转成有效的数据,例如把“123”转成整数,如果没有转成功会默认转成0值 (对应类型的默认值)

指针

  1. 对于基本数据类型,变量存的是值,也叫值类型。
  2. 获取变量的地址用&符号,对于变量i,其地址为&i
  3. 指针类型变量存储的是一个地址,这个地址指向的内存空间才是值
  4. 获取指针类型所指向的值,使用*,例如p为指针类型,*p表示指向的值
var i int = 10 // 定义整型
var p *int = &i // 定义一个int类型指针变量。该类型(int)需要和所指向的变量地址存储的类型对应
fmt.Println("address of i is ",p)
fmt.Println("The address of pointer p is",&p)
fmt.Println("The value pointed to by the pointer p is",*p)
/*
output:
address of i is  0xc0000aa058
The address of pointer p is 0xc0000ce018
The value pointed to by the pointer p is 10
*/

通过指针修改变量值

*p = 13
fmt.Println("The value changed of i is ,", i)

注意事项:

  1. 指针变量只能被赋值成地址
  2. int类型的指针变量只能接收int类型变量的地址
var a int32 = 300
// var ptr *float32 = &a 无法将int类型的变量a的地址赋值给float32类型的指针变量ptr
var b float32 = float32(a) // 需要进行强制转换
var ptr *float32 = &b 
  1. 值类型,都有对应的指针类型,形式为*数据类型,比如int类型,其对应的指针类型为*int,float32对应的指针类型就是*float32。
  2. 值类型包括:基本数据类型int,float,bool,string,数组和结构体struct
  3. 引用类型:指针、slice切片、map、管道、interface等

值类型和引言类型的使用特点:

  1. 值类型:变量直接存储,内存通常在栈中分配
  2. 引用类型:其存储的是一个地址,地址指向的空间才是真正存储值,内存通常在堆区分配,当没有任何变量引用这个地址时,该地址对应的数据空间成为垃圾,被GC回收。

变量命名规范

  1. 变量名、函数名、常量名采用驼峰法
  2. 如果变量名、函数名、常量名首字母大写,则可以被其他包访问(公有);如果首字母小写,则只能在本包中使用(私有)。Golang中没有privacypublic等关键字。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值