基本数据类型
Go 语言是一种静态类型的变成语言,在Go编程语言中,数据类型用于声明函数和变量,数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存。编译器在进行编译的时候,就要知道每个值的类型,这样编译器就知道要为这个值分配多少内存,并且知道这段分配内存表示什么。
布尔型
布尔型的值只可以是常量 true 和 false
package main
import "fmt"
func main() {
// var 变量名 数据类型
// bool: 默认值为 false
var isFlag bool = true
fmt.Printf("%T,%t\n",isFlag,isFlag)
}
数值类型
整型 int 和浮点型 float32\float64, Go 语言支持整型和浮点型数字,并且支持复数,其中位的运算采用补码。
Go 也有基于架构的类型,例如:unit 无符号、int 有符号
- 整形
序号 | 类型和描述 |
---|---|
1 | unit8 无符号 8 位整型(0到255) |
2 | unit16 无符号 16 位整型(0到65535) |
3 | unit32 无符号 32 位整型(0到4294967295) |
4 | unit64 无符号 64 位整型(0到18446744073709551615) |
5 | int8 有符号 8 位整型(-128到127) |
6 | int16 有符号 16 位整型(-32768到32767) |
7 | int32 有符号 32 位整型(-2147483648到2147483647) |
8 | int64 有符号 64 位整型(-9223372036854775808到9223372036854775807) |
查询占用的空间大小 字节数 :unsafe.Sizeof()
package main
import "fmt"
func main() {
// var 变量名 数据类型
var age int = 18
var money float64 = 3.9
fmt.Printf("%T,%d\n",age,age) // int,18
fmt.Printf("%T,%.2f\n",money,money) // float64, 默认是6位小数
num:=30
fmt.Printf("num=%v 类型:%T\n",num,num)
fmt.Println(unsafe.Sizeof(num)) // 表示64位的计算机 int 就是 int64 占用8个字节
}
其他更多的数字类型
- byte 和 rune
序号 | 类型和描述 |
---|---|
1 | byte 类似 unit8 |
2 | rune 类似 int32 |
3 | unit 32 或 64 |
4 | int 与 unit 一样大小 |
5 | uintptr 无符号整型,用于存放一个指针 |
- 浮点型
序号 | 类型和描述 |
---|---|
1 | float32 IEEE-754 32位浮点型 |
2 | float64 IEEE-754 64位浮点型 |
3 | complex64 32位实数和虚数 |
4 | complex128 64位实数和虚数 |
输出浮点类型数据:%.2f
精度丢失的问题:(而精致浮点数精度丢失)
m1 := 8.2
m2 := 3.8
fmt.Println(m1 - m2) // 结果 4.4 ,打印 4.39999999999
解决方案:[https://github.com/shopspring/decimal]
- 先下载
- 再引入
package main
import (
"fmt"
"decimal"
)
m1 := 8.2
m2 := 3.8
m3 := decimal.NewFromFloat(m1).Sub(decimal.NewFromFloat(m2))
fmt.Println(m3)
字符串
GO的字符串是由单个字节链接起来的。Go语言的字符串的字节使用UTF-8编码标识 Unicode的。【string】
-
字符串拼接符号
+
-
转义字符
\
(\\ , \",
) -
\n 换行;\t 制表符
-
文件中的换行:\r\n
-
多行字符串使用 反引号 " ` "
-
字符串中常用方法
-
strings 包需要引入
-
切片(也叫数组)
arr := []string{"php","java","golang"}
方法 | 介绍 |
---|---|
len(str) | 求长度 |
+ 或 fmt.Sprintf | 拼接字符串(注意 + 写的位置) |
strings.Split | 切片,分割 |
strings.contains | 判断是否包含 |
strings.HasPrefix,strings.HasSuffix | 前缀/后缀判断 |
strings.Index(),strings.lastIndex() | 子串出现的位置 |
strings.Join(a[]string, sep string) | join操作 |
注意:strings.Index(),strings.lastIndex()
查找不到返回 -1 ,查找到返回下标的位置,下标从 0 开始
package main
import "fmt"
func main() {
// 字符串定义
var str1 string = "str1"
var str2 = "str2"
str3 := "str3"
var str string
str = "sjskjdskjdks"
fmt.Printf("%T,%s\n",str,str)
// 单引号, 整形ASCII 编码
v1 :='A'
v2 := "A"
// 编码表:ASCII 表
// 扩展
// 所有中国字的编码表 :GBK
// 全世界的编码表 :Unicode
fmt.Printf("%T,%d\n",v1,v1) // int32,65
fmt.Printf("%T,%d\n",v2,v2)
}
数据类型的转换
在必要以及可行的情况下,一个类型的值可以转换成另一种类型的值。
由于Go语言不存在隐式类型转换,因此所有的类型转换都必须显式的声明:
valueOfTypeB = typeB(valueOfTypeA)
- 在go语言中没法将整形转换成 bool
- bool 无法参数数值运算,也无法与其他类型进行转换
package main
import "fmt"
func main() {
a:=3 //int
b:=5.0 // float64
// 将 int 类型的a转换为 float64 类型
c := float64(a)
d := int(b)
// bool 整形是不能转换为 bool 类型的
// e := bool(a)
// float64 尽量使用 float64 来定义浮点类型的小数
fmt.Printf("%T\n",a) // int
fmt.Printf("%T\n",b) // float64
fmt.Printf("%T\n",c) // float64
fmt.Printf("%T\n",d) // int
fmt.Printf("%T\n",e) //.\hello.go:14:15: cannot convert a (variable of type int) to type bool
}
strconv包
- strconv.FormatInt
- strconv.Formatfloat(float64(f), ‘f’, 4, 32)
- strconv.FormatBool // 意义不大
- strconv.FormatUint( uint64(a), 10)
package main
import "fmt"
import "strconv"
func main() {
var i int = 20
str :=strconv.FormatInt(int64(i), 10) // int64 和操作系统有关系
fmt.Printf("%v,%T", str, str) // 20,string
}
字符串转换成数值
- strconv.ParseInt(参数1:string, 参数2:进制, 参数3:位数 32 64 16)
- string 类型转换成 bool 类型的意义不大,不介意进行转换
- 数值类型没法和bool类型进行转换
默认值
int 默认值是0
float 默认值是 0
string 默认是空
- 一个汉字占用 3 个字节(utf-8), 一个字母占用一个字节
- golang 中使用的是 utf-8 编码,编码后对应的值就是 int 类型
Printf 格式化参数常用
Printf
%v : 值
%T : 类型
%c
%.2f : 浮点类型
%d : 整数
%t : bool
%c : byte