变量
变量是程序的基本组成单位,表示内存中的一个存储区域。
该区域有自己的名称(变量名)和类型(数据类型)。
golang的变量如果没有赋初值,编译器会使用默认值,比如int默认值0,string默认值为空串。
bit是计算机中最小的存储单位,bite是计算机中最基本的存储单位。
1bite=8bit
变量的使用
package main
import "fmt"
func main(){
//golang的变量使用方法一:
//定义变量/声明变量+赋值
var i int=10
//若不赋值,int的默认值为0
//使用变量
fmt.Println("i=",i)
//方法二:
//根据值自行判定变量类型(类型推导)
var num=10
//方法三:
//省略var,注意:=左侧的变量不能是已经声明过的
//否则会导致编译错误
//下面的方式等价 var name string ="tmo"
name:="tom"
}
多个变量的声明(一)
var n1,n2,n3 int
fmt.Println("n1=",n1,"n2=",n2,"n3=",n3)
多个变量的声明(二)
var n1,name,n3=100,"tom",888
//n1=100,name=tom,n3=888
多个变量的声明(三)
//同样可以使用类型推导
n1,name,n3:=100,"tom",888
如何定义全局变量
package main
import "fmt"
//定义全局变量
var n1=100
var n2=200
var name="jack"
//上面的声明方式,也可以改成一次性声明
var(
n3=300
n4=900
name2="mary"
)
func main(){
fmt.Println("n1=",n1)
fmt.Println("name=",name)
}
程序中+号的使用:
1.当左右两边都是数值型时,则做加法运算
2.当左右两边都是字符串,则做字符串拼接
变量的数据类型
byte表示一个1个字节
int8就是八位一个字节
float32表示单精度,float64表示双精度
整数类型:
基本介绍:简单来说就是用于存放整数值的,比如0,-1,235等等。
整型的使用细节:
如何查看变量的数据类型
func main(){
var n1=100
//使用格式化输出
fmt.Printf("n1的类型是%T",n1)
//输出结果:
//n1的类型是int
}
如何在程序查看某个变量的占用字节大小和数据类型(使用较多)
package main
import "fmt"
import "unsafe"
func main(){
var n1 int64=100
fmt.Printf("n1的类型是 %T n1占用的字节数是 %d ",n1,unsafe.Sizeof(n1))
//输出结果:
//n1的类型是 int64 n1占用的字节数是 8
}
小数类型/浮点型:
package main
import(
"fmt"
)
func main(){
var price float32=89.12
fmt.Println("price=",price)
}
1.浮点数=符号位+指数位+尾数位,说明浮点数都是有符号的。
2. golang的浮点类型有固定的范围和字段长度,不受电脑系统(os)影响。
3. golang的浮点型默认声明为float64类型。
4.可以省略0,比如.123代表的就是0.123。
5.支持科学计数法
6.通常情况使用float64,因为更精确
字符类型:
golang中没有专门的字符类型,如果要储存单个字符(字母),一般使用byte来保存。
字符串就是一串固定长度的字符连接起来的字符序列。
go的字符串是由单个字节连接起来的。也就是说对于传统的字符串是由字符组成的,而go的字符串不同,它是由字节组成的。
package main
import "fmt"
func main(){
var c1 byte='a'
var c2 byte='0'
//当我们直接输出byte值,就是输出了对应字符的码值
fmt.Println("c1=",c1)
fmt.Println("c2=",c2)
//若要输出对应的字符,则需要使用格式化输出
fmt.Printf("c1=%c c2=%c",c1,c2)
//输出结果
//c1= 97
//c2= 48
//c1=a c2=0
}
当我们要输出一个汉字的时候,汉字的码值超出了byte的范围,所以可以使用int
var c3 int ='北'
fmt.Printf("c3=%c c3对应码值=%d",c3,c3)
输出结果:
如果字符在ascll表的,可以直接保存到byte,若字符大于对应码值255,可以考虑使用int类型保存。
go语言的字符使用UTF-8编码,国际通用的,包含了ascll表。英文字母占一个字节,汉字占三个字节。
//“国”字对应的码值是22269
var cc4 int 22269
fmt.Printf("c4=%c",c4)
//输出结果为 c3=国
字符类型是可以进行运算的,相当于一个整数,运算时是按照码值运算的。
字符型存储到计算机中,需要将字符对应的码值找出来
存储:字符–>对应码值–>二进制–>存储
读取:二进制–>码值–>字符–>读取
布尔类型:
bool类型数据只允许取值true和false
bool类型占1个字节
boolean类型适于逻辑运算,一般用于程序流程控制。
字符串类型:
string类型
package main
import "fmt"
func main(){
var str string="你好"
fmt.Println(str)
}
使用反引号可以输出一大串内容,包括特殊字符等
字符串拼接
基本数据的默认值
整型:0
浮点型:0
字符串:“ ”
布尔类型:false
package main
import "fmt"
func main(){
var str string
//这里的%v表示按照变量的值输出
fmt.Printf("str=%v",str)
}
基本数据类型的转换
golang和java/c不同,go在不同类型的变量之间赋值时需要显式转换。也就是说golang中数据类型不能自动转换。
在转换中,比如将int64转成int8,编译时不会报错,只是转换的结果是按溢出处理,和我们希望的结果不一样。
题一:
n2=n1+20
n2的类型是int64,而n1+20结果类型是int64,编译会出错。
n3=n1+20同理
正确写法:
题二:
n4=int(n1)+127
编译可以通过,但是会溢出,结果不是127+12
n3=int8(n1)+128
编译不通过,因为128>127,其实第一个式子相加结果也大于127,但是编译系统查不出错误,按溢出处理。
基本数据类型和string的转换
转换前后,两个变量的数据类型都不变。
基本数据类型转string
方法一:
package main
import "fmt"
func main(){
var num int =99
var str string
str=fmt.Sprintf("%d",num)
fmt.Printf("str type %T str=%v\n",str,str)
//输出结果str type string str=99
//转换成功,其他数据类型转string也类似
}
有一点要注意的是,不同数据类型转化为string时,上面代码中%d不是固定的,比如将布尔类型转化为string,就要将%d改为%t。
方法二:strconv函数
int转string
package main
import (
"fmt"
"strconv"
)
func main(){
var num int =99
var str string
str=strconv.FormatInt(int64(num),10)
fmt.Printf("str type %T str=%q\n",str,str)
//输出结果str type string str="99"
}
float64转string
package main
import (
"fmt"
"strconv"
)
func main(){
var num float64 =23.456
var str string
str=strconv.FormatFloat(num,'f',10,64)
//f表示标准格式,10表示小数位保留十位,64表示这个小数是float64
fmt.Printf("str type %T str=%q\n",str,str)
//输出结果str type string str="23.4560000000"
}
bool转string
package main
import (
"fmt"
"strconv"
)
func main(){
var m bool =true
var str string
str=strconv.FormatBool(m)
fmt.Printf("str type %T str=%q\n",str,str)
//输出结果str type string str="true"
}
方法三:strconv包中有一个函数Itoa
package main
import (
"fmt"
"strconv"
)
func main(){
var num int =456
var str string
str=strconv.Itoa(num)
fmt.Printf("str type %T str=%q\n",str,str)
}
string转基本数据类型
使用strconv包的函数
string ->bool
输出结果b type bool b=true
string->int
package main
import (
"fmt"
"strconv"
)
func main(){
var str string ="123456"
var num int64
num,_=strconv.ParseInt(str,10,64)
fmt.Printf("num type %T num=%v",num,num)
//输出结果num type int64 num=123456
}
string->float64
package main
import (
"fmt"
"strconv"
)
func main(){
var str string ="123.456"
var num float64
num,_=strconv.ParseFloat(str,64)
fmt.Printf("num type %T num=%v",num,num)
//输出结果num type float64 num=123.456
}
注意事项
在将string类型转化为基本数据类型时,要确保string类型能够转成有效的数据。比如我们可以吧“123”转成一个整数,但不能把“hello”转成一个整数,如果这样做,golang直接将其转成0。其他类型也是一样的道理。float变成0,bool变成false。