赞
踩
在Go编程语言中,数据类型用于声明函数和变量。
数据类型的出现是为了数据分成所内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,这样就可以充分利用内存。
Go语言按照类别分别由以下集中数据类型:
简单来说,整数类型就是用来存放整数值的。
类型 | 有无符号 | 占用存储空间 | 表数范围 |
---|---|---|---|
int8 | 有 | 1字节 | -128~127 |
int16 | 有 | 2字节 | -215~215-1 |
int32 | 有 | 4字节 | -231~231-1 |
int64 | 有 | 8字节 | -263~263-1 |
案例
package main import( "fmt" ) func main(){ // 测试取值范围 var j int8 = -128 fmt.Println(j) //j = -129 as int8 value in assignment (overflows) var a int8 = 127 fmt.Println(a) //a = 128 as int8 value in assignment (overflows) // int的其他数据类型取值范围同样严格要求表数范围 }
类型 | 有无符号 | 占用存储空间 | 表数范围 |
---|---|---|---|
uint8 | 无 | 1字节 | 0~255 |
uint16 | 无 | 2字节 | 0~216-1 |
uint32 | 无 | 4字节 | 0~232-1 |
uint64 | 无 | 8字节 | 0~264-1 |
unit
与int
相比取值范围更大,并且无负数,原因是因为:
就int8
而言,因为有一位要表示符号位,因此如果除符号位为负,则最小值为-27,如果符号位为正,则最大值为27-1。
就unit8
而言,不需要以为表示符号位,因此如果每一位都为0,则最小值为0,如果每一位都为1,则最大值为28-1。
package main import( "fmt" ) func main(){ // 测试unit8取值范围 var a uint8 = 255 fmt.Println(a) //a = 256 as uint8 value in assignment (overflows) var b uint8 = 0 fmt.Println(b) //b = -1 as uint8 value in assignment (overflows) fmt.Println(b) }
整形的使用细节:
1)Golang中各整数类型分为:有符号和无符号,int uint的默认大小和系统有关。
2)Golang的整形默认声明为int型。
3)在程序中使用格式化输出可以查看某个变量的字节大小和数据类型。
fmt.Printf(“%T” , 变量名)
fmt.Printf(“%d” , unsafe.Sizeof(变量名)) 需要引入unsafe包
4)Golang程序中整形变量在使用时,遵守选小不选大的原则,即:在保证程序正常运行下,尽量使用占用空间小的数据类型。
Golang的浮点型用来存放小数值。
浮点型的分类
类型 | 占用存储空间 | 表数范围 |
---|---|---|
float32 | 4字节 | -3.403E38~3.4.3E38 |
float64 | 8字节 | -1.798E308~1.798E308 |
1)关于浮点数在机器中存放形式的简单说明,浮点数=符号位+指数位+尾数位
2)尾数部分可能丢失。造成精度损失。
3)float32和float64都是有符号的。
4)Golang的浮点型默认声明为float64类型。
案例
package main import( "fmt" ) func main(){ var price float32 = 89.12 fmt.Println(price) // float32 和 float64都是有符号的 var num1 float32 = -0.00 var num2 float64 = -0.00 fmt.Println("num1= " , num1 , "num2= " , num2) // 尾数部分可能丢失,造成精度损失 // float64 比 float32精度更大 var num3 float32 = -123.0000901 // num3= -123.00009 var num4 float64 = -123.0000901 fmt.Println("num3=", num3 , "num4" , num4) num5 := 89.001 fmt.Printf("%T", num5) //float64 }
Golang中没有专门的字符类型,如果要存储单个字符,一般用byte
来保存。字符串就是一串固定长度的字符连接起来的字符序列,Golang的字符串是由单个字节连接起来的,也就是说对于传统的字符串是由字符组成的,而Go的字符串不同,它是由字节组成的。
package main import( "fmt" ) // 演示golang中字符类型使用 func main(){ var c byte = '0' var d byte = 'b' // 输出字符对应的ascii码 fmt.Println("c=" , c) //48 fmt.Println("d=" , d) //98 // 如果想要输出字符内容,需要采用格式化输出 fmt.Printf("%c\n", c) //0 fmt.Printf("%c\n", d) //b // byte的取值范围是0-255,'中'字符如果存在buye中会出现overflows溢出,因此我们需要使用其他类型 var a int = '中' fmt.Printf("%c", a) }
1)如果保存的字符在ASCII表中,可以直接保存到byte中。
2)如果保存的字符对应码值大于255,这时可以考虑使用int类型。
3)如果想要输出字符内容,需要采用格式化输出。
在Go语言中,字符串字面量使用""
或者'
反引号来创建。双引号用来创建可解析的字符串,支持转义。但不能用来引用多行;反引号用来创建原生的字符串字面量,可能由多行组成,但不支持转义,并且可以包含除了反引号外其他所有字符。双引号创建可解析的字符串应用最广泛,反引号用来创建原生的字符串则多用于书写多行消息,HTML以及正则表达式。
package main import( "fmt" ) // 演示golang中字符串类型使用 func main(){ str1 := "ljy" str2 :=` <html> <head>ljy</head> </html>` fmt.Println(str1) fmt.Println(str2) }
使用+号
虽然Go中的字符串是不可变的,但是字符串支持+
级联操作和+=
追加操作,例如:
package main import( "fmt" ) // 演示golang中字符串类型使用 func main(){ name := "ljy" age := "12" msg := name + " " + age fmt.Println(name) fmt.Println(age) fmt.Println(msg) //ljy 12 msg += name fmt.Println(msg) //ljy 12ljy msg += age fmt.Println(msg) //ljy 12ljy12 }
golang里面的字符串都是不可变的,每次运算都会产生一个新的字符串,所以会产生很多临时的无用的字符串,不仅没有用,还会给gc带来额外的负担,所以性能比较差。
使用fmt.Sprintf()
函数
package main
import(
"fmt"
)
// 演示golang中字符串类型使用
func main(){
name := "ljy"
age := "12"
// 使用fmt.Sprintf()函数拼接
msg := fmt.Sprintf("%s,%s",name , age)
fmt.Println(msg)
}
内部使用
[]byte
实现,不像直接运算符这种会产生很多临时的字符串,但是内部的逻辑比较复杂,由很多额外的判断,还用到了interface
,所以性能也不是很好。
strings.Join()
package main
import(
"fmt"
"strings"
)
// 演示golang中字符串类型使用
func main(){
name := "ljy"
age := "20"
msg := strings.Join([]string{name,age},",")
fmt.Println(msg)
}
join会先根据字符串数组的内容,计算出一个拼接之后的长度,然后申请对应大小的内润,一个一个字符串填入,在已有一个数组的情况下,这种效率会很高,但是本来没有,去构造这个数据的代价也不小。
buffer.WriteString()
package main
import(
"fmt"
"bytes"
)
// 演示golang中字符串类型使用
func main(){
var buffer bytes.Buffer
buffer.WriteString("ljy")
buffer.WriteString(",")
buffer.WriteString("20")
fmt.Println(buffer.String())
}
这个比较理想,如果当成可变字符使用,对内存的增长也有优化,如果能预估字符串的长度,还可以使用
buffer.Grow()
接口来设置capacity。
Go语言的字符串常见转义符包含回车、换行、单双引号、制表符等,如下表所示。
转义符 | 含义 |
---|---|
\r | 回车符(返回行首) |
\n | 换行符(直接跳到下一行的同列位置) |
\t | 制表符 |
\' | 单引号 |
\" | 双引号 |
\\ | 反斜杠 |
package main import( "fmt" ) // 演示golang中字符串类型使用 func main(){ // 字符串切片操作 str := "hello world" n := 3 m := 5 fmt.Println(str[n]) // 获取字符串索引位置为n的原始字节 fmt.Println(str[n:m]) // 截取得字符串索引位置为n到m-1的字符串 fmt.Println(str[n:]) // 截取得字符串索引位置为n到len(str) - 1的字符串 fmt.Println(str[:m]) // 截取得字符串索引位置为0到m-1的字符串 }
函数 | 作用 |
---|---|
len(str) | 求字符串长度 |
+或fmt.Sprintf() | 拼接字符串 |
strings.Split() | 分割字符串,以指定规则 |
strings.Contains() | 判断是否包含 |
strings.HasPrefix,strings.HasSuffix | 前缀/后缀判断 |
strings.Index(),strings.LastIndex() | 字串出现的位置 |
strings.koin(a[]sring,sep string) | join操作 |
package main import( "fmt" "strings" ) // 演示golang中字符串类型使用 func main(){ // 字符串常用操作 str := "hello world" fmt.Println(len(str)) //获取字符串长度 fmt.Println(strings.Split(str , " ")) //字符串分割 fmt.Println(strings.Contains(str , "hello")) //判断是否包含字串 fmt.Println(strings.HasPrefix(str , "hello")) //判断是否作为前缀 fmt.Println(strings.HasSuffix(str , "world")) //判断是否作为后缀 fmt.Println(strings.Index(str , "l")) //字串出现的位置 fmt.Println(strings.LastIndex(str , "l")) //join拼接操作 }
go语言中的布尔类型有两个常量值:true
和false
。布尔类型经常用在条件判断语句,或者循环语句。也可以用在逻辑表达式中。
案例
package main import( "fmt" ) func main(){ var b1 bool = true var b2 bool = false var b3 = true var b4 = false b5 := true b6 := false fmt.Println(b1) fmt.Println(b2) fmt.Println(b3) fmt.Println(b4) fmt.Println(b5) fmt.Println(b6) }
package main import( "fmt" ) func main(){ num1 := 13 ok := num1 >= 18 if ok { fmt.Println("您已经成年!") } else { fmt.Println("您还未成年!") } }
package main
import(
"fmt"
)
func main(){
for i:= 0 ; i < 10 ; i++ {
fmt.Printf("i=%v \t", i)
}
}
package main
import(
"fmt"
)
func main(){
age := 18
gender := "男"
if age >= 18 && gender == "男" {
fmt.Println("你是成年男子!")
}
}
不能用0和非0数表示真假
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。