Golang基本类型

113 阅读5分钟

基本类型

速查表

类型长度(字节)默认值说明
bool1false
byte10实际为uint8
rune40Unicode Code Point, 实际为int32
int, uint4或8032 或 64 位
int8, uint810-128 ~ 127, 0 ~ 255
int16, uint1620-32768 ~ 32767, 0 ~ 65535
int32, uint3240-21亿~ 21亿, 0 ~ 42亿
int64, uint6480
float3240.0
float6480.0
complex648
complex12816
uintptr4或8以存储指针的 uint32 或 uint64 整数
array值类型
struct{}值类型
string“”UTF-8 字符串
slicenil引用类型
mapnil引用类型
channelnil引用类型
interfacenil接口
functionnil函数

::: tip 提示 空为nil,而不是null :::

整型

按长度分为:int8int16int32int64, 对应的无符号整型:uint8uint16uint32uint64

浮点型

float32float64

复数

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

布尔值

bool类型只有:true(真)false(假) ::: danger 警告 go中bool类型的变量不能作为0参与数值运算,也不会转换类型,也无法将其它类型强制转为bool值 :::

字符串

go中的字符串是utf-8的编码格式(支持中文),字符串的格式为"字符串值"

a := "hello"
b := "你好"

字符串转义符

转义含义
\r回车符(返回行首)
\n换行符(直接跳到下一行的同列位置)
\t制表符
'单引号
\"双引号
\\反斜杠
示例代码如下:
a:="\r"
b:="\n"
c:="\t"
d:="'"  //单引号无需加\
e:="\""
f:="\\"

多行字符串

go可以使用反引号实现多行字符串

a := `第一行
第二行
第三行
`
fmt.println(a)

::: tip 注意 在反引号中所有转义字符都将失效 :::

字符串操作

方法介绍
len(str)求长度
str[n:m]字符截取左闭右开
+或fmt.Sprintf拼接字符串
strings.Split分割
strings.Contains判断是否包含
strings.HasPrefix判断前缀
strings.HasSuffix判断后缀
strings.Index子串开始出现的位置
strings.LastIndex子串最后出现的位置
strings.Join(a[]string,sep string)join操作

::: tip 提示 strings提供了很多字符串方法,这里只列举常用的几个,其它方法可以自行尝试 :::

len求字符串的长度:

a := len("hello")   // a=5
a := len("h")       // a=1
a := len("你")      // a=3
a := len("。")      // a=3

::: tip 注意 需要注意的是英文字符只占1个字节,而中文占3个字节 :::

字符串截取:

s := "golangcaff"
s[:3]   // gol

// 包含中文时可以这样截取
str := "你好world"
a := []rune(str)
string(a[:2]) // 你好

::: tip 注意 如上len求长度一样,中文占3个字节,使用这种方法截取字符串需要注意截取数值 :::

字符串拼接可以使用+或者fmt.Sprintf():

a := "hello"
a  = a + " world"
b := fmt.Sprintf("hello %s", "world")

字符串分割成数组strings.Split与字符串数组join字符串strings.Join:

str := "1.2.3.4"
a := strings.Split(str, ".")    // [1 2 3 4]
b := strings.Join(a, "-")       // 1-2-3-4

字符串是否包含某个子串strings.Contains:

str := "nihao.world"
a := strings.Contains(str, "hao")   // a=true

字符串前缀和后缀判断:

str := "nihao.world"
a := strings.HasPrefix(str, "ni")   // true
b := strings.HasSuffix(str, "ld")   // true

字符串查询子串出现位置:

str := "nihaoya"
a := strings.Index(str, "a")        // 3
b := strings.LastIndex(str, "a")    // 6

byte和rune

字符类型有两种byte(1个字节,表示ASCII码)和rune(4个字节,代表utf8的一个字符),用单引号'包裹起来类型为rune,如:

a := '你'   // rune类型
b := 'h'    // rune类型
str := "nihao"
str[0]      // byte类型

在遍历含有中文的字符串时,由于str[i]的类型为byte会出现问题,使用range则得到的字符为rune不会出现问题,如:

s := "你好world"
for i := 0; i < len(s); i++ { //byte
    fmt.Printf("%v(%c) ", s[i], s[i])  // 228(ä) 189(½) 160( ) 229(å) 165(¥) 189(½) 119(w) 111(o) 114(r) 108(l) 100(d)
}
for _, r := range s { //rune
    fmt.Printf("%v(%c) ", r, r)     // 20320(你) 22909(好) 119(w) 111(o) 114(r) 108(l) 100(d)
}

类型转换

Go中只有强制类型转换,没有隐式类型转换,整型和浮点型可以通过T(表达式)的方法转换,如:

a := 3
fmt.Println(a / 2)          // 1
fmt.Println(float64(a) / 2) // 1.5
b := 3.14
fmt.Println(int(b))         // 3
fmt.Println(int(b) / 2)     // 1

字符串与整型和浮点型的转换需要同过strconv方法,如下:

// string到int  
int,err := strconv.Atoi(string)  

// string到int64  
int64, err := strconv.ParseInt(string, 10, 64)  
//第二个参数为基数(2~36),
//第三个参数位大小表示期望转换的结果类型,其值可以为0, 8, 16, 32和64,
//分别对应 int, int8, int16, int32和int64

// int到string  
string := strconv.Itoa(int) 
//等价于
string := strconv.FormatInt(int64(int),10)
 
// int64到string  
string := strconv.FormatInt(int64,10)  
//第二个参数为基数,可选2~36
//对于无符号整形,可以使用FormatUint(i uint64, base int)

// float到string
string := strconv.FormatFloat(float32,'E',-1,32)
string := strconv.FormatFloat(float64,'E',-1,64)
// 'b' (-ddddp±ddd,二进制指数)
// 'e' (-d.dddde±dd,十进制指数)
// 'E' (-d.ddddE±dd,十进制指数)
// 'f' (-ddd.dddd,没有指数)
// 'g' ('e':大指数,'f':其它情况)
// 'G' ('E':大指数,'f':其它情况)

// string到float64
float,err := strconv.ParseFloat(string,64)

// string到float32
float,err := strconv.ParseFloat(string,32)