一、基本数据类型
在go语言中,主要有基本数据类型与复合数据类型。主要有以下类型:
基本数据类型:
- 整型(int)
- 浮点型(float)
- 布尔型(bool)
- 字符串(string)
复合数据类型:
- 数组
- 切片
- 结构体
- 函数
- map
- 通道(channel)
- 接口
1.整型(int)
整型又可以细分有符号整型与无符号整型,有符号整型为int8、int16、int32、int64,无符号整型有uint8、uint16、uint32、uint64对应的区别如下表:
| 类型 | 范围 | 占用空间(字节) | 有无符号 |
|---|---|---|---|
| int8 | (-128 到 127)-2^7 到 2^7-1 | 1 | 有 |
| int16 | (-32768 到 32767) -2^15 到 2^15-1 | 2 | 有 |
| int32 | (-2147483648 到 2147483647) -2^31到 2^31-1 | 4 | 有 |
| int64 | (-9223372036854775808 到 9223372036854775807)-2^63 到 2^63-1 | 8 | 有 |
| uint8 | (0-255)0到 2^8-1 | 1 | 无 |
| uint16 | (0 到 65535)0到2^16-1 | 2 | 无 |
| uint32 | (0 到 4294967295) 0 到 2^32-1 | 4 | 无 |
| uint64 | (0 到 18446744073709551615) 0 到 2^64-1 | 8 | 无 |
特别说明:
在golang中,可以使用unsafe.Sizeof()函数查看变量在内容中的存储空间大小。
2.浮点型(float)
浮点型可以分为float32与float64,在go语言中浮点型存在精度的问题。如下:
func main() {
// 声明变量方式
var num1 = 3.42
var num2 = 2.2
// 期待输出1.22,但是输出1.2199999999999998
fmt.Println(num1 - num2)
}
因此要解决精度的问题,需要引入第三方包进行解决。
3.布尔型(bool)
在go语言中,布尔值不能作为用着数值运算,并且没有隐式转换机制,比如所不能将1看着是true,将0看着是false。在其中,如果声明但是没有赋值的话,默认为false。
4.字符串(string)
使用双引号包裹,如果要定义多行字符串,可以使用反引号进行包裹。
字符串中一些常用方法(注意:使用到strings的方法需要引入strings包)
| 方法 | 介绍 |
|---|---|
| len(str) | 求长度 |
| +或者fmt.Sprintf() | 拼接字符串 |
| strings.Split() | 分割字符 |
| strings.Contains | 判断是否包含 |
| stings.HasPrefix,stings.HasSuffix | 前缀/后缀判断 |
| strings.Index(),strings.LastIndex() | 子串出现的位置 |
| strings.Join(a[]sting,sep sting) | join拼接操作 |
5.字符
在go中,字符使用单引号包裹,字符只能有一位,超过了就是字符串。字符类型主要有两种。
- uint8:或者叫byte型,代表的是一个ASCII码的值
- rune:代表一个utf-8字符
案例:循环输出字符串中每个字符的ASCII码值。
func main() {
// 声明变量方式
var str1 = "hello,world"
for i := 0; i < len(str1); i++ {
// 输出104(h)101(e)108(l)108(l)111(o)44(,)119(w)111(o)114(r)108(l)100(d)
fmt.Printf("%v(%c)", str1[i], str1[i])
}
}
注意:如果字符串中有汉字,使用for循环输出的值不正确,需要使用range循环函数。
func main() {
// 声明变量方式
var str1 = "你好"
// 注意前面的_占位符
for _, v := range str1 {
fmt.Printf("%v(%c)", v, v)
}
}
修改字符,golang中不能直接修改字符的值,首先需要将转换为byte或者rune类型
func main() {
// 声明变量方式
var str1 = "good golang"
// 先将str1转为rune类型
var str2 = []byte(str1)
str2[0] = 'h' // 注意:这里是字符,要使用单引号
fmt.Println(str1)
// 输出”hood golang“
fmt.Println(string(str2))
}
如果字符串中含有汉字或者要改变的字符是汉字,需要转换为rune类型
func main() {
// 声明变量方式
var str1 = "你好"
// 先将str1转为rune类型
var str2 = []rune(str1)
str2[0] = '她' // 注意:这里是字符,要使用单引号
fmt.Println(str1)
// 输出”她好“
fmt.Println(string(str2))
}
6.类型之间进行转换
整型之间与浮点型之间进行转换
func main() {
// 声明变量方式
// 整型之间转换直接强制转换即可,推荐将地位往高位进行转换,不然容易造成溢出
var a int8 = 16
var b int16 = 130
fmt.Println(int16(a) + b)
// 浮点型之间转换与整型之间同理
var c float32 = 2.34
var d float64 = 356
fmt.Println(float64(c) + d)
}
其他类型转换为字符串类型
fmt.Sprintf不仅仅可以用来进行字符串拼接,同样可以将其他类型转换为字符串类型。
func main() {
// 声明变量方式
var a int = 12
// 将a转换为string类型
var str1 = fmt.Sprintf("%d", a)
// 输出12-string
fmt.Printf("%v-%T", str1, str1)
}
使用
strconv包把其他类型转换转换为string类型
func main() {
// 声明变量方式
var a int = 12
// 将a转换为string类型
// 注意:FormatInt()接收两个参数,第一个参数必须是64位,第二个表示是十进制
var str1 = strconv.FormatInt(int64(a), 10)
fmt.Printf("%v-%T", str1, str1)
}
同理:与FormatInt()方法类似有FormatFloat(),FormatBool(),FormatUnit()方式,使用方式类似,可以查看源码进行了解。
同样,可以使用strconv将string类型转换为float类型
func main() {
// 声明变量方式
var str1 string = "1234.8"
// 将str1转换为float,注意_占位符,因为ParseFloat()函数会返回两个值,如果转换失败err会有值,一般使用_这种匿名变量进行占位
// a, err := strconv.ParseFloat(str1, 64)
// 推荐使用
a, _ := strconv.ParseFloat(str1, 64)
fmt.Printf("%.2f-%T", a, a)
}
同理:与ParseFloat()方法类似有ParseInt(),ParseBool(),ParseUnits()方式,使用方式类似,可以查看源码进行了解。