golang基础1-3:GO语言基本数据类型

GO语言基本数据类型

1. 介绍

在 Go 编程语言中,数据类型用于声明函数和变量。

数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存。

go语言基本数据类型分为数字类型、字符串类型、布尔类型

2.数字类型

2.1 整数类型

GO语言中整数类型分为有符号无符号(类型前面以u开头),有符号即从**-2(n-1)~2(n-1)-1**,例如int8的取值范围为-128127,无符号即表示取值为非负数,取值范围从**02^n -1**, 例如uint8的取值范围为0~255

GO整数类型大小罗列:

类型 描述
uint8 无符号 8 位整型 (0 到 255)
uint16 无符号 16 位整型 (0 到 65535)
uint32 无符号 32 位整型 (0 到 4294967295)
unit64 无符号 64 位整型 (0 到 18446744073709551615)
int8 有符号 8 位整型 (-128 到 127)
int16 有符号 16 位整型 (-32768 到 32767)
int32 有符号 32 位整型 (-2147483648 到 2147483647)
int64 有符号 64 位整型 (-9223372036854775808 到 9223372036854775807)

通常int类型的处理速度也是最快的。因为这是操纵系统根据字节的计算架构自动调整最佳的int类型

2.2 浮点类型

在GO语言中是没有double类型的,GO语言只支持两种浮点型数:float32float64,这两种浮点型数据格式遵循IEEE 754标准: float32 的浮点数的最大范围约为 3.4e38,可以使用常量定义:math.MaxFloat32float64 的浮点数的最大范围约为 1.8e308,可以使用一个常量定义:math.MaxFloat64

2.3 复数

复数有实部和虚部,complex64的实部和虚部为32位,complex128的实部和虚部为64位。

2.4 其他数字类型

类型 描述
byte 类似 uint8
rune 类似 int32
uint 32 或 64 位
int 与 uint 一样大小
uintptr 无符号整型,用于存放一个指针

3.字符串类型

一个Go语言字符串是一个任意字节的常量序列。[] byte

在Go语言中,字符串字面量使用双引号 "" 或者反引号 ' 来创建。双引号用来创建可解析的字符串,支持转义,但不能用来引用多行;反引号用来创建原生的字符串字面量,可能由多行组成,但不支持转义,并且可以包含除了反引号外其他所有字符。双引号创建可解析的字符串应用最广泛,反引号用来创建原生的字符串则多用于书写多行消息,HTML以及正则表达式。

3.1 单行和多行字符串

举例:

package main

import "fmt"

func main() {
	// 用""引起来的字符串不支持多行但支持转义,
    // 用``支持多行,但不支持转义
	var str1 string = "hello world"
	var html string = `
		
			
				hello golang
			
		
	`

	fmt.Printf("str1: %v\n", str1)
	fmt.Printf("html: %v\n", html)
}

运行结果:

str1: hello world
html: 
		
			
				hello golang
			
		

3.2 字符串拼接

方式一:使用 ++= 拼接字符串

虽然Go语言中的字符串是不可变的,但是字符串支持 + 级联操作和+=追加操作

golang 里面的字符串都是不可变的,每次运算都会产生一个新的字符串,所以会产生很多临时的无用的字符串,不仅没有用,还会给 gc 带来额外的负担,所以性能比较差

举例:

package main

import "fmt"

func main() {
	// 使用+或者+=进行字符串拼接,只能是字符串和字符串拼接,不可拼接别的类型
	name := "wanik"
	age := "20"
	msg := name + " " + age
	fmt.Printf("msg: %v\n", msg)
	fmt.Println("------------------")
	msg = ""
	msg += name
	msg += " "
	msg += age
	fmt.Printf("msg: %v\n", msg)
}

打印结果:

msg: wanik 20
------------------
msg: wanik 20

方式二:使用fmt.Sprintf()拼接字符串

内部使用 []byte 实现,不像直接运算符这种会产生很多临时的字符串,但是内部的逻辑比较复杂,有很多额外的判断,还用到了 interface,所以性能也不是很好

package main

import "fmt"

func main() {
	name := "wanik"
	age := "20"
	msg := fmt.Sprintf("%s %s", name, age)
	fmt.Printf("msg: %v\n", msg)
}

打印结果:

msg: wanik 20

方式三:使用strings.Join() 拼接字符串

join会先根据字符串数组的内容,计算出一个拼接之后的长度,然后申请对应大小的内存,一个一个字符串填入,在已有一个数组的情况下,这种效率会很高,但是本来没有,去构造这个数据的代价也不小

package main

import {
    "fmt"
    "strings"
)

func main() {
	name := "tom"
	age := "20"
	msg := strings.Join([]string{name, age}, ",")
	fmt.Printf("msg: %v\n", msg)
}

方式四: **buffer.WriteString()**方式拼接字符串

这个比较理想,可以当成可变字符使用,对内存的增长也有优化,如果能预估字符串的长度,还可以用 buffer.Grow() 接口来设置 capacity

package main

import (
	"bytes"
	"fmt"
)

func main() {
	var buffer bytes.Buffer
	buffer.WriteString("wanik")
	buffer.WriteString(",")
	buffer.WriteString("20")
	fmt.Printf("buffer.String(): %v\n", buffer.String())
}

4. 布尔类型

go语言中的布尔类型有两个常量值:truefalse。布尔类型经常用在条件判断语句,或者循环语句。也可以用在逻辑表达式中。

你可能感兴趣的:(go,#,golang基础,golang,开发语言,后端)