目录
1.变量
1.1 变量使用的三种方式
● 第一种:指定变量类型。声明后若不赋值,使用默认值
● 第二种:根据值自行判断(类型推导)
● 第三种:省略var。注意:=左侧的变量应该是没有声明过的,否则编译错误
package main
import "fmt"//ftm保重提供格式化,输入输出函数
func main(){
//变量声明
//第一种
var i int
i=10
fmt.Println(i)
//第二种
var m =10.1
fmt.Println(m)
//第三种
name := "wang"//等价于 var name string name="wang"
fmt.Println(name)
}
1.2 多变量声明
//一次声明多个对象
//第一种
var n1,n2,n3 int
fmt.Println(n1,n2,n3)
//第二种
var m1,m2,m3 = 1,2,3
fmt.Println(m1,m2,m3)
//第三种
a1,a2,a3 :=100,"wang",10.2
fmt.Println(a1,a2,a3)
1.3 全局变量
//定义全局变量
var aa1=100
var aa2="ww"
//推荐使用
var (
aa3=200
aa4="ee"
)
2. 数据类型
2.1 数值型
2.1.1 整数类型
● 查看变量类型及字节数
●fmt.Printf(“a1的类型是%T,a2占用的字节数是%d”,a1,unsafe.Sizeof(a2))
●输出:a1的类型是int,a2占用的字节数是16
2.1.2 浮点型
说明:
● 浮点数都是有符号的
● 尾数部分可能丢失,造成精度损失
● 浮点类型有固定的范围和长度,不受OS影响
● 浮点型默认为float64
● 浮点型有两种表示形式:十进制和科学计数法
//十进制数形式:如:5.12 .512(必须有小数点)
num6 := 5.12
num7 := .123//=> 0.123
fmt.Println("num6=",num6,"num7=",num7)//num6= 5.12 num7= 0.123
//科学计数法形式
num8 :=5.1234e2 //? 5.1234* 10的2次方
num9 := 5.1234E2//?5.1234 *10的2次方
num10 := 5.1234E-2 //?5.1234 / 10的2次方0.051234
fmt.Println("num8=",num8,"num9=",num9,"num10=",num10)//num8= 512.34 num9= 512.34 num10= 0.051234
2.2 字符类型
● go语言中没有专门的字符类型,如果要存储单个字符,一般使用byte
● go语言的字符是由单个字节连起来的
var c1 byte='a'
var c2 byte='0'
//当我们直接输出byte值,就是输出了对应的的字符的码值
fmt.Println("c1=",c1,"c2=",c2)//c1= 97 c2= 48
//如果要输出对应的字符,需要格式化输出
fmt.Printf("c1=%c c2=%c\n",c1,c2)//c1=a c2=0
//var c3 byte='北' //overflow溢出
var c3 int='北'
fmt.Printf("c3=%c c3对应码值=%d",c3,c3)//c3=北 c3对应码值=21271
● go语言使用utf-8编码,英文1个字节,汉字3个字节
● 在go中,字符的本质是一个整数,直接输出时,是该字符对应的utf-8编码的码值
● 可以直接给某个变量赋一个数字,然后格式化输出时%c,会输出该数字对应的Unicode码
● 字符类型是可以进行运算的,相当于一个整数,因为它对应的是Unicode码
2.3 布尔类型
● 只允许取值true和false
● 占用一个字节
2.4 String类型
● 字符串就是一串固定长度的字符连接起来的字符序列。go语言的字符串是由单个字节连接起来的,使用utf-8
● 字符串一旦赋值,字符串就不能修改了,在go中字符串是不可变的
● var str =“hello”
● str[0]=‘a’ 这里不能修改str的内容,go中字符串是不可变的
● 字符串的两种表示方式
○ 双引号,会识别转义字符
○ 反引号,以字符串的原生形式展示,包括换行和特殊字符,可以防止攻击,输出源码等效果使用
2.5 基本数据类型的默认值
● 整数:0
● 浮点型:0
● 字符串:""
● 布尔类型:false
2.6 基本数据类型相互转换
● go语言和java不同,go在不同变量类型之间赋值时需要显示转换。不能自动转换
● T(V) 将值V转换为类型T
var i int32=100
var n1 float32=float32(i)
var n2 int8=int8(i)
var n3 int64=int64(i)
fmt.Printf("i=%v n1=%v n2=%v n3=%v",i,n1,n2,n3)//i=100 n1=100 n2=100 n3=100
注意事项
● 数据类型的转换可以是从 表示范围小–>表示范围大,也可以 范围大–>范围小
● 被转换的是变量存储的数据即值,变量本身的数据类型并没有变化
● 在转换中,比如将int64转成int8[-128–127],编译时不会报错,只是转换的结果是按溢出处理,和我们希望的结果不一样,因此在转换时,需要考虑范围
var n1 int32=12
var n2 int8
var n3 int8
n2=int8(n1)+127//编译通过,但是结果不是127+12,按溢出处理
n3=int8(n1)+128//编译不通过
fmt.Println(n2,n3)
var n1 int32=12
var n2 int64
var n3 int8
n2=n1+20//int32--->int64 错误
n3=n1+20//int32--->int8 错误
2.7 基本数据类型和String的转换
2.7.1 方式一:fmt.Sprintf("%参数",表达式)
var num1 int=90
var num2 float64=23.345
var b bool=true
var c byte='j'
var str string
str=fmt.Sprintf("%d",num1)
fmt.Printf("str type %T str =%q\n",str, str)//str type string str ="90"
str=fmt.Sprintf("%f",num2)
fmt.Printf("str type %T str =%q\n",str, str)//str type string str ="23.345000"
str=fmt.Sprintf("%t",b)
fmt.Printf("str type %T str =%q\n",str, str)//str type string str ="true"
str=fmt.Sprintf("%c",c)
fmt.Printf("str type %T str =%q\n",str, str)//str type string str ="j"
2.7.2 方式二:使用strconv包函数
var num3 int=99
var num4 float64=23.3453
var num5=232
var b2 bool
var str1 string
str1=strconv.FormatInt(int64(num3),10)
fmt.Printf("str1 type %T str1 =%q\n",str1, str1)//str1 type string str1 ="99"
str1=strconv.FormatFloat(num4,'f',10,64)//'f'格式 10:表示小数位保留10位 64:表示这个小数是float64
fmt.Printf("str1 type %T str1 =%q\n",str1, str1)//str1 type string str1 ="23.3453000000"
str1=strconv.FormatBool(b2)
fmt.Printf("str1 type %T str1 =%q\n",str1, str1)//str1 type string str1 ="false"
str1=strconv.Itoa(int(num5))
fmt.Printf("str1 type %T str1 =%q\n",str1, str1)//str1 type string str1 ="232"
2.8 String类型转基本数据类型
var str string ="true"
var b bool
b,_=strconv.ParseBool(str)
//trconv.ParseBool(str)函数会返回两个值(value bool,err error),我们只想获得第一个值,err可以使用_忽略
fmt.Printf("b type %T b=%v\n",b,b)//b type bool b=true
var str2 string="1234"
var n1 int64
var n2 int
n1,_=strconv.ParseInt(str2,10,64)//b type bool b=true
n2=int(n1)
fmt.Printf("n1 type %T n1=%v\n",n1,n1)//n1 type int64 n1=1234
fmt.Printf("n2 type %T n2=%v\n",n2,n2)//n2 type int n2=1234
var str3 string ="123.3"
var f1 float64
f1,_=strconv.ParseFloat(str3,64)//n2 type int n2=1234
fmt.Printf("f1 type %T f1=%v\n",f1,f1)//f1 type float64 f1=123.3
注意事项:
● 将string转为基本数据类型时,要确保string类型能够转换为有效的数据,如果把hello转为一个整数,得到的结果会是0,bool类型转换时,非bool时结果为false