Go数据类型详细解析

Go数据类型详解

Go语言中有丰富的数据类型,除了基本的整型、浮点型、布尔型、字符串外,还有数组、切片、结构体、函数、map、通道(channel)等。Go语言的基本类型和其他语言大同小异。

一:整型

(一):进制
  1. 十进制

    我们通常见的数字为10进制数,比如3,4等数字

    i1 := 10
    
  2. 八进制

    如果我们在十进制前面加上0则代表这个数为8进制数,比如03,04等,0后面的每一位数字最大不能超过7,比如08,068是不合法的

    i2 := 077
    
  3. 十六进制

    如果在10进制前面加上0x则代表16进制数,如0x3,0x4等,0x后面的每一位都不能超过f,比如0x2g是不合法的。

    i3 := 0x123ea
    
(二):进制转换

​ %b代表二进制,%d表示10进制,%o代表八进制,%x代表十六进制

package main

import "fmt"

func main() {
	// 定义10进制数
	i1 := 101
	fmt.Printf("i1=%d\n",i1)  // --> 101
	fmt.Printf("i1=%b\n",i1)  // --> 1100101
	fmt.Printf("i1=%o\n",i1)  // --> 145
	fmt.Printf("i1=%x\n",i1)  // --> 65
}
(三):查看数据类型

无论是十进制还是其它进制,类型都为int类型,即整型。查看数据类型可使用 %T。

package main

import "fmt"

func main() {
	// 定义10进制数
	i1 := 101
	
	fmt.Printf("i1=%b\n",i1)
	fmt.Printf("%T\n",i1)  // --> int
	
	fmt.Printf("i1=%x\n",i1)
	fmt.Printf("%T\n",i1)  // --> int

}

二:浮点数

Go语言支持两种浮点类型:float32和float64。这两种浮点型数据格式遵循IEEE 754标准:float32的浮点数的最大范围约为3.4e38,可以使用常量定义:math.MaxFloat32;float的浮点数的最大范围约为1.8e308,可以使用一个常量定义:math.MaxFloat64.

打印浮点数时,可以使用fmt包配合动词%f,代码如下:

package main

import "fmt"

func main() {
	f1 := 1.223344
	fmt.Printf("%T\n",f)  // Go中的小数类型默认都是float64类型

	// 可强制转换为float32类型
	f2 := float32(1.1234)
	fmt.Printf("%T\n",f2)
}

注:上述代码中的f1和f2之间不能进行相互赋值,即不能进行f1=f2操作,因为float32与float64为两种完全不一样的数据类型,类型不同不能进行赋值操作。

四:布尔值

Go语言中以bool类型进行声明布尔型数据,布尔型数据只有true和false两个值

注:

  1. 布尔类型变量的值默认为false
  2. Go语言中不允许将整型强制转换为布尔型
  3. 布尔型无法参与数值运算,也无法与其它类型进行转换
package main

import "fmt"

func main() {
	bool1 := true
	var bool2 bool

	fmt.Printf("%T\n",bool1)  // --> bool
	fmt.Printf("%T\n",bool2)  // --> bool
	
	// %v可匹配任意类型的变量的值
	fmt.Printf("bool1:%v\nbool2:%v",bool1,bool2)  --> true,false
}

五:字符串

Go语言中的字符串以原生数据类型出现,使用字符串就像使用其他原生数据类型(int,float,bool)一样。Go语言里的字符串的内部实现使用UTF-8编码。字符串的值为双引号中的内容,可以在Go语言的源码中直接添加非ASCII码字符。

扩展:字节,字符,字符串区别

  • 1字节 = 8bit(8个二进制位),1个英文字符=1个字节,一个汉字一般占3个字节
  • 字符串为字符的组合体,“a”,"我"这样的单独的字符,汉字或者符号称为字符,“asfa”则称为字符串
  1. 字符串转义符

    转义符 含义
    \r 回车符(返回行首)
    \n 换行符(直接跳到下一行的同列位置)
    \t 制表符
    \’ 单引号
    \" 双引号
    \\ 反斜杠
  2. 多行字符串

    Go语言中要定义一个多行字符串时,就必须使用反引号字符。反引号内的内容会原样输出,在反引号中使用的所有转义字符都将无效。

    package main
    
    import "fmt"
    
    func main() {
    	// 多行字符串,结果会原样输出
    	s := `
    我叫二狗\n
    			我今年18\t
    	我喜欢隔壁村的小芳
    	`
    	fmt.Println(s)
    }
    

    输出结果如下图:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HfVih9h2-1608563542945)(C:\Users\Administrator\Desktop\第三阶段\GOlang\images\str.png)]

  3. 字符串常用操作

    方法 介绍
    len(str) 求长度
    +或fmt.Sprintf 拼接字符串
    strings.Split 分割
    strings.contains 判断是否包含
    strings.HasPrefix/strings.HasSuffix 开头/结尾判断
    strings.Index()/strings.LastIndex() 子串第一个索引/最后一个索引
    strings.Join([],sep string) join拼接操作

    len()长度演示

    package main
    
    import "fmt"
    
    func main() {
    	// 多行字符串,结果会原样输出
    	s := `
    我叫二狗\n
    			我今年18\t
    	我喜欢隔壁村的小芳
    	`
    	fmt.Println(s)
    	fmt.Println(len(s))  // -->63
    }
    

    +或fmt.Sprintf拼接演示

    方式二与方式三的区别:方式二会直接将拼接后的内容打印出来,而方式三是将拼接的内容返回,需用一个变量来接受

    package main
    
    import "fmt"
    
    func main() {
    	// 字符串拼接操作
    	name := "kid"
    	feature := "cool"
    
    	fmt.Println(name + feature)  // 方式一,用+号进行拼接
    	fmt.Printf("%s%s\n",name,feature)  // 方式二,以格式化方式拼接
    	full := fmt.Sprintf("%s%s",name,feature)  // 方式三,以Sprint方法拼接
    	fmt.Println(full)
    }
    

    strings.Split分割演示

     package main
    
    import "fmt"
    import "strings"
    
    func main() {
    	// 字符串分割操作
    	path := `E:\Golang\src\github.com\dream_kid\day01\string`
    	// 此处需对 \ 进行转义
    	result := strings.Split(path,"\\")
    	fmt.Println(result)  // --> [E: Golang src github.com dream_kid day01 string]
    }
    

    strings.contains判断包含演示

    package main
    
    import "fmt"
    import "strings"
    
    func main() {
    	// 判断包含演示
    	str := `hello world`
    	fmt.Println(strings.Contains(str,"hi")) // --> false
    }
    

    strings.HasPrefix/strings.HasSuffix 开头/结尾判断

    package main
    
    import "fmt"
    import "strings"
    
    func main() {
    	// 开头结尾判断
    	fmt.Println(strings.HasPrefix(str,"he"))  // --> true
    	fmt.Println(strings.HasSuffix(str,"ll"))  // --> false
    }
    

    strings.Index()/strings.LastIndex() 子串索引判断

    package main
    
    import "fmt"
    import "strings"
    
    func main() {
    	ss := "adsfsfkjfs"
    	// 出现子串的第一个索引位置
    	fmt.Println(strings.Index(ss,"s"))  // --> 2
    	// 出现子串的最后一个索引位置
    	fmt.Println(strings.LastIndex(ss,"s"))  // --> 9
    }
    

    strings.Join([],sep string) join拼接操作

     package main
    
    import "fmt"
    import "strings"
    
    func main() {
    	path := `E:\Golang\src\github.com\dream_kid\day01\string`
    	result := strings.Split(path,"\\")
    	fmt.Println(result)  // --> [E: Golang src github.com dream_kid day01 string]
    	
    	// join
    	fmt.Println(strings.Join(result,":"))  // --> E::Golang:src:github.com:dream_kid:day01:string
    }
    

六:byte和rune类型

​ 组成每个字符串的元素叫做字符,可以通过遍历或者单个获取字符串元素或得字符。字符是用单引号包裹起来的。在Go里字符与字符串是通过是双引号或单引号来进行严格区分的。

​ Go语言的字符有以下两种:

  • uint8类型,或者叫byte型,代表了ASCII码的一个字符。
  • rune类型,代表一个UTF-8字符

当需要处理中文,日文或者其它复合字符时,则需要用到rune类型。rune类型实际是一个int32。

当我们打印字符时,输出的是一个编码位置。

package main

import "fmt"

func main() {
	w1 := "hello"
	w2 := 'h'  // ASCII码下,一个英文字母占一个字节(8bit)
	fmt.Println(w1)  // --> hello
	fmt.Println(w2)  // --> 104 (ASCII编码位置)

	s1 := "北京" 
	s2 := '北'  // UTF-8编码下一个中文占3个字节
	fmt.Println(s1)  // --> 北京
	fmt.Println(s2)  // --> 21271(utf8编码位置)

	l := "hello北京"
	// len返回的为字节的数量
	fmt.Println(len(l))  // --> 11
}

七:修改字符串

要修改字符串,需要先将其转换为[]rune或[]byte,完成后再转换成string。无论哪种转换,都会重新分配内存,并赋值字节数组。

package main

import "fmt"

// 将北京改为南京
func main() {
	wb := "北京"  // '北' '京'
	wn := []rune(wb)  // ['北','京'] 把字符串强制转换成一个rune切片,切片中保存的是字符
	wn[0] = '南'  // 这里修改的是字符,所以一定要用单引号,不能使用双引号
	fmt.Println(string(wn))  // 把rune切片强制转换成字符串
}

八:类型转换 (仅供了解)

只要整型和浮点型能够相互转换

package main

import "fmt"

func main() {
	w := 10
	var n float64
	n = float64(w)
	fmt.Printf("%T %f", n,n)
} 

nc main() {
wb := “北京” // ‘北’ ‘京’
wn := []rune(wb) // [‘北’,‘京’] 把字符串强制转换成一个rune切片,切片中保存的是字符
wn[0] = ‘南’ // 这里修改的是字符,所以一定要用单引号,不能使用双引号
fmt.Println(string(wn)) // 把rune切片强制转换成字符串
}


### 八:类型转换 (仅供了解)

只要整型和浮点型能够相互转换

package main

import “fmt”

func main() {
w := 10
var n float64
n = float64(w)
fmt.Printf("%T %f", n,n)
}


你可能感兴趣的:(go,数据类型,编程语言,字符串)