目录
一、概述
1、变量使用注意事项
2、变量的数据类型
3、整型的使用细节
4、浮点类型
浮点型的分类
浮点类型使用细节
5、字符类型(char)
字符类型使用细节
6、布尔类型:bool
7、字符串类型:string
二、类型转换
1、基本数据类型的转换
2、基本数据类型和string的转换
2.1、基本数据类型转string
2.2、string类型转基本数据类型
为什么需要变量?
变量相当于内存中一个数据存储空间的表示,你可以把变量看做是一个房间的门牌号,通过门牌号我们可以找到房间,同样的道理,通过变量名可以访问到变量(值)。
声明变量
基本语法:var 变量名 数据类型
package main
import "fmt"
//全局变量
var m1=100
var m2=24.5
var m3="marry"
//一次性声明
var (
x1=100
x2=24.5
x3="marry"
)
func main(){
var i int
fmt.Println("i=",i)
var num=10.11
fmt.Println("num=",num)
name :="tom"//等价于:var name string name="tom"
fmt.Println("name=",name)
//var n1,n2,n3 int
//var n1,n2,n3=100,"tom",33.20
n1,n2,n3 :=100,"tom",33.20
fmt.Println("n1=",n1,"n2=",n2,"n3=",n3)
}
程序中+号的使用
每一种数据都定义了明确的数据类型,在内存中分配了不同大小的内存空间。
数据类型
注:在Golang中,官方文档将string归属在基本数据类型
基本数据类型默认值
package main
import (
"fmt"
"unsafe"
)
func main(){
var n1 = 100
fmt.Printf("n1的类型 %T,n1占用的字节数是 %d ",n1,unsafe.Sizeof(n1))
}
说明一下:
package main
import (
"fmt"
)
func main(){
var price float32 = 90.34
fmt.Println("price",price)
var num1 float32 = -123.0000901
var num2 float64 = -123.0000901
fmt.Println("num1=",num1,"num2=",num2)//num1= -123.00009 num2= -123.0000901
}
Golang中没有专门的字符类型,如果要存储单个字符(字母),一般使用byte来保存。
字符串就是一串固定长度的字符连接起来的字符序列。Go的字符串是由单个字符连接起来的。也就是说对于传统的字符串是由字符组成的,而Go的字符串不同,它是由字节组成的。
package main
import (
"fmt"
)
func main() {
var c1 byte ='a'
var c2 byte ='0'
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 int ='北'
var c4 int =22269
fmt.Printf("c3=%c c4=%c\n",c3,c4)//c3=北 c4=国
var n1=10 +'a'
fmt.Println("n1=",n1)//n1= 107
}
package main
import (
"fmt"
"unsafe"
)
func main(){
var f =false
fmt.Printf("f的类型 %T,f占用的字节数是 %d ",f,unsafe.Sizeof(f))//f的类型 bool,f占用的字节数是 1
}
字符串就是一串固定长度的字符连接起来的字符序列。Go的字符串是由单个字节连接起来的。Go语言的字符串的字节使用UTF-8编码标识Unicode文本
字符串一旦赋值了,字符串就不能修改了,在Go中字符串是不可变的
字符串的两种表现形式
字符串的拼接方式 +
当一行字符串太长时,需要使用到多行字符串,+号留在上一行
Golang和Java/c不同,Go在不同类型的变量之间赋值时需要显式转换。也就是说Golang中数据类型不能自动转换
基本语法:
表达式 T(v):将值v转换为类型T
T:就是数据类型,比如int32,int64,float32等等
v:就是需要转换的变量
例:
var i int =42
var f float64 = float64(i)
var u uint8 = uint8(f)
fmt.Println(i,f,u)
var n1 int32 = 12
var n2 int8 =int8(n1) + 127//编译通过,但是结果不是127+12 按溢出处理
fmt.Println(n1,n2)
方式1:
"fmt"下的Sprintf方法
func Sprintf(format string, a ...interface{}) string
:Sprintf根据format参数生成格式化的字符串并返回该字符串。
-----------------------------------------------------
package main
import (
"fmt"
)
func main() {
var n1 int = 99
var n2 float64 =23.45
var b bool = true
var c byte = 'a'
var str string
str=fmt.Sprintf("%d",n1)
fmt.Printf("str type %T value=%v\n",str,str)
str=fmt.Sprintf("%.2f",n2)
fmt.Printf("str type %T value=%v\n",str,str)
str=fmt.Sprintf("%t",b)
fmt.Printf("str type %T value=%v\n",str,str)
str=fmt.Sprintf("%c",c)
fmt.Printf("str type %T value=%v\n",str,str)
}
方式2:
使用strconv包的函数
func Itoa(i int) string:Itoa是FormatInt(i, 10) 的简写。
func FormatBool(b bool) string:根据b的值返回"true"或"false"。
func FormatInt(i int64, base int) string:返回i的base进制的字符串表示。base 必须在2到36之间,结果中会使用小写字母'a'到'z'表示大于10的数字。
func FormatUint(i uint64, base int) string:是FormatInt的无符号整数版本。
func FormatFloat(f float64, fmt byte, prec, bitSize int) string:函数将浮点数表示为字符串并返回。
bitSize表示f的来源类型(32:float32、64:float64),会据此进行舍入。
fmt表示格式:'f'(-ddd.dddd)、'b'(-ddddp±ddd,指数为二进制)、'e'(-d.dddde±dd,十进制指数)、'E'(-d.ddddE±dd,十进制指数)、'g'(指数很大时用'e'格式,否则'f'格式)、'G'(指数很大时用'E'格式,否则'f'格式)。
prec控制精度(排除指数部分):对'f'、'e'、'E',它表示小数点后的数字个数;对'g'、'G',它控制总的数字个数。如果prec 为-1,则代表使用最少数量的、但又必需的数字来表示f。
---------------------------------------------------------------------
package main
import (
"fmt"
"strconv"
)
func main() {
var n1 int64 = 99
var n2 float64 =23.45
var b bool = true
var n3 uint64 = 123
var str string
str = strconv.FormatInt(n1,10)
fmt.Printf("str type %T value=%v\n",str,str)
str = strconv.Itoa(int(n1))
fmt.Printf("str type %T value=%v\n",str,str)
str = strconv.FormatFloat(n2,'f',10,64)//说明:'f':格式 10:表示小数位保留10位 64:表示这个小数是float64
fmt.Printf("str type %T value=%v\n",str,str)
str = strconv.FormatBool(b)
fmt.Printf("str type %T value=%v\n",str,str)
str = strconv.FormatUint(n3,10)
fmt.Printf("str type %T value=%v\n",str,str)
}
使用strconv包的函数
func ParseBool(str string) (value bool, err error):返回字符串表示的bool值。它接受1、0、t、f、T、F、true、false、True、False、TRUE、FALSE;否则返回错误。
func ParseInt(s string, base int, bitSize int) (i int64, err error):返回字符串表示的整数值,接受正负号。
base指定进制(2到36),如果base为0,则会从字符串前置判断,"0x"是16进制,"0"是8进制,否则是10进制;
bitSize指定结果必须能无溢出赋值的整数类型,0、8、16、32、64 分别代表 int、int8、int16、int32、int64;返回的err是*NumErr类型的,如果语法有误,err.Error = ErrSyntax;如果结果超出类型范围err.Error = ErrRange。
func ParseUint(s string, base int, bitSize int) (n uint64, err error):ParseUint类似ParseInt但不接受正负号,用于无符号整型。
func ParseFloat(s string, bitSize int) (f float64, err error):解析一个表示浮点数的字符串并返回其值。
如果s合乎语法规则,函数会返回最为接近s表示值的一个浮点数(使用IEEE754规范舍入)。bitSize指定了期望的接收类型,32是float32(返回值可以不改变精确值的赋值给float32),64是float64;返回值err是*NumErr类型的,语法有误的,err.Error=ErrSyntax;结果超出表示范围的,返回值f为±Inf,err.Error= ErrRange。
-------------------------------------------------------------------------------
package main
import (
"fmt"
"strconv"
)
func main() {
var str string = "true"
var b bool
b , _ = strconv.ParseBool(str)
fmt.Printf("b type %T value=%v\n",b,b)
str = "1234567"
n1, _ := strconv.ParseInt(str,10,0)
fmt.Printf("n1 type %T value=%v\n",n1,n1)
str = "123.35"
f1, _ := strconv.ParseFloat(str,64)
fmt.Printf("f1 type %T value=%v\n",f1,f1)
}
注意:在将string类型转成基本数据类型时,要确保string类型能够转成有效的数据。例:不能把"hello"转成一个整数,如果这样做Golang直接将其转换成0.其他类型也是一样的道理,没有转成功,则转成默认值。
干我们这行,啥时候懈怠,就意味着长进的停止,长进的停止就意味着被淘汰,只能往前冲,直到凤凰涅槃的一天!