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

一、整型

1.1 基本类型

整型分为以下两个大类: 按长度分为:int8(8位2进制数)、int16、int32、int64 对应的无符号整型:uint8、uint16、uint32、uint64

其中,uint8就是我们熟知的byte型,int16对应C语言中的short型,int64对应C语言中的long型。

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

1.2 其他数字类型

类型 描述
uint 32位操作系统上就是uint32,64位操作系统上就是uint64
int 32位操作系统上就是int32(相当于内存最大空间是2^32 大概就是4g),64位操作系统上就是int64
uintptr 无符号整型,用于存放一个指针

注意: 在使用int和 uint类型时,不能假定它是32位或64位的整型,而是考虑int和uint可能在不同平台上的差异。

注意事项 获取对象的长度的内建len()函数返回的长度可以根据不同平台的字节长度进行变化。实际使用中,切片或 map 的元素数量等都可以用int来表示。在涉及到二进制传输、读写文件的结构描述时,为了保持文件的结构不会受到不同编译目标平台字节长度的影响,不要使用int和 uint。

1.3 八进制&十六进制

package main

import "fmt"

func main(){
// 十进制
var a int = 10
fmt.Printf("%d \n", a) // 10
fmt.Printf("%b \n", a) // 1010 占位符%b表示二进制 // 八进制 以0开头
var b int = 077
fmt.Printf("%o \n", b) // 77 // 十六进制 以0x开头
var c int = 0xff
fmt.Printf("%x \n", c) // ff
fmt.Printf("%X \n", c) // FF // 变量的内存地址
fmt.Printf("%p \n", &a) // 0xc00004c080 占位符%p表示十六进制的内存地址

关于进制转换之后会在(https://www.cnblogs.com/forever521Lee/p/10620859.html)

占位符总结(https://www.cnblogs.com/forever521Lee/p/10620865.html)

二、浮点型

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

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

package main
import (
"fmt"
"math"
)
func main() {
fmt.Printf("%f\n", math.Pi)
fmt.Printf("%.2f\n", math.Pi) //小数点后精确2位
}

浮点数特别需要注意金融方面、p2p涉及到钱方面的浮点型操作时几毛几精确运算时,就如同下面(不精确)

两种方式解决:

1、转换成字符串,然后再去进行一个运算操作;

2、加入系统精确到分,那么我们就将其乘1000进行整数操作,这样就可以避免出现错误

三、复数

complex64和complex128

var c1 complex64
c1 = 1 + 2i
var c2 complex128
c2 = 2 + 3i
fmt.Println(c1)
fmt.Println(c2)

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

四、布尔值

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

注意:

  1. 布尔类型变量的默认值为false。
  2. Go 语言中不允许将整型强制转换为布尔型. (比如py可以将0和1转换为true和false,但是go语言中是不允许的)
  3. 布尔型无法参与数值运算,也无法与其他类型进行转换。

五、字符串

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

s1 := "hello"
s2 := "你好"

5.1 字符串转义符

Go 语言的字符串常见转义符包含回车、换行、单双引号、制表符等,如下表所示。

转义符 含义
\r 回车符(返回行首)
\n 换行符(直接跳到下一行的同列位置)
\t 制表符
\’ 单引号
\” 双引号
\ 反斜杠(在go语言中用于转义)

举个例子:

package main
import (
"fmt"
)
func main() {
fmt.Println("str := \"c:\\Code\\lesson1\\go.exe\"")
}

5.2 多行字符串

Go语言中要定义一个多行字符串时,就必须使用反引号字符:

s1 := `第一行
第二行
第三行
`
fmt.Println(s1)

反引号间换行将被作为字符串中的换行,但是所有的转义字符均无效,文本将会原样输出。

5.3 字符串的常用操作

方法 介绍
len(str) 求长度
+或fmt.Sprintf 拼接字符串
strings.Split 分割
strings.contains 判断是否包含
strings.HasPrefix,strings.HasSuffix 前缀/后缀判断
strings.Index(),strings.LastIndex() 子串出现的位置
strings.Join(a[]string, sep string) join操作

举例

    s1:= "hardenMVP"
fmt.Println(len(s1))
// 字符串拼接
s2 := "houston"
fmt.Println(s1+s2)
s3 := fmt.Sprintf("%s----%s", s1, s2)
fmt.Println(s3)
// 分割
ret := strings.Split(s1, "n")
fmt.Println(ret)
// 判断是否包含
ret2 := strings.Contains(s1, "MVP")
fmt.Println(ret2)
// 判断前缀和后缀
ret3 := strings.HasPrefix(s1, "har")
ret4 := strings.HasSuffix(s1, "VP")
fmt.Println(ret3, ret4)
// 求子串的位置
s4 := "applepen"
fmt.Println(strings.Index(s4, "p"))
fmt.Println(strings.LastIndex(s4, "p"))
// join
a1 := []string{"Python", "PHP", "JavaScript", "Ruby", "Golang"}
fmt.Println(strings.Join(a1, "-"))

5.4 byte和rune类型

组成每个字符串的元素叫做“字符”,可以通过遍历或者单个获取字符串元素获得字符。 字符用单引号(’)包裹起来,如:

var a := '中'
var b := 'x'

Go 语言的字符有以下两种: 1. uint8类型,或者叫 byte 型,代表了ASCII码(能表示的最大位数是8位(2^8-1 也就是0-255)对于英文来说足够用了)的一个字符。 2. rune类型(可以动态识别(识别到底是中文还是英文)),代表一个 UTF-8字符。

utf-8编码下一个中文占3-4位(个字节)

s1 := "Golang"
c1 := 'G' // ASCII码下占一个字节(8位 8bit(1bit就是01(二进制)))
fmt.Println(s1, c1)
s2 := "中国"
c2 := '中' // UTF-8编码下一个中文占3个字节
fmt.Println(s2, c2)

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

Go 使用了特殊的 rune 类型来处理 Unicode,让基于 Unicode 的文本处理更为方便,并且使用 byte 型进行默认字符串处理,性能和扩展性都有照顾。

// 遍历字符串
func traversalString() {
s := "hello沙河"
for i := 0; i < len(s); i++ { //byte
fmt.Printf("%v(%c) ", s[i], s[i]) //默认for循环按照ASCII码去打印 %c表示输出单个字符
}
fmt.Println()
for _, r := range s { //rune for range 循环 是按照rune类型去遍历的
fmt.Printf("%v(%c) ", r, r) //for range循环后是按照utf8编码打印
}
fmt.Println()
}

输出:

104(h) 101(e) 108(l) 108(l) 111(o) 230(æ) 178(²) 153() 230(æ) 178(²) 179(³)
104(h) 101(e) 108(l) 108(l) 111(o) 27801(沙) 27827(河)

注意:

1、遍历中英文混合字符用for range循环

2、字符串底层是一个byte数组,所以可以和[]byte类型相互转换。字符串是不能修改的 字符串是由byte字节组成,所以字符串的长度是byte字节的长度。 rune类型用来表示utf8字符,一个rune字符由一个或多个byte组成。

5.5 修改字符串

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

func changeString() {
s1 := "big"
// 强制类型转换
byteS1 := []byte(s1)
byteS1[0] = 'p'
fmt.Println(string(byteS1)) s2 := "白萝卜"
runeS2 := []rune(s2)
runeS2[0] = '红'
fmt.Println(string(runeS2))
}

六、类型转换

Go语言中只有强制类型转换,没有隐式类型转换。 基本语法:

T(表达式)

其中,T表示要转换的类型。表达式包括变量、复杂算子和函数返回值等. 比如计算直角三角形的斜边长。

例1:

func sqrtDemo() {
var a, b = 3, 4
var c int
// math.Sqrt()接收的参数是float64类型,需要强制转换
c = int(math.Sqrt(float64(a*a + b*b)))
fmt.Println(c)
}

例2:

// 强制类型转换
s5 := "big"
// 将字符串强制转换成字节数组类型
byterArray := []byte(s5)
fmt.Println(byterArray)
byterArray[0] = 'p'
fmt.Println(byterArray)
// 将字节数组强制转换成字符串类型
s5 = string(byterArray)
fmt.Println(s5)

1.3 Go语言基础之数据类型的更多相关文章

  1. Go语言基础之数据类型

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

  2. C语言基础知识-数据类型

    C语言基础知识-数据类型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.常量与变量 1>.关键字 C的关键字共有32个. >.数据类型关键字(12个) char,s ...

  3. 01_Java语言基础部分(数据类型与表达式、流程控制语句、数组与方法)

    1. Java语言主要由5中符号组成 标识符:数字.字母.美元符.下划线(注意不能数字开头) 关键字(被Java赋予特殊意义的单词,注意所有关键字都是小写):   goto和const保留了它们,但是 ...

  4. C#语言基础之数据类型

    数据类型 1.值类型(1)整型:有符号整型和无符号整型. 区别是无符号整型要比有符号整型的正数范围大.2X+1 有符号整型:sbyte,short,int,long  带有正负数,范围按所写依次增大 ...

  5. c语言基础——基本数据类型

    1.基本数据类型是什么?包括有哪些代表?除了基本数据类型还有什么其他类型形式? (1)基本数据类型--用于描述基本的数据 (数.日期等) (2)有整型.实型.字符型.枚举类型等等 ========== ...

  6. python自动化--语言基础一数据类型及类型转换

    Python中核心的数据类型有哪些?变量(数字.字符串.元组.列表.字典) 什么是数据的不可变性?哪些数据类型具有不可变性数据的不可变是指数据不可更改,比如: a = () #定义元组 #a[]= # ...

  7. 021- Java语言基础-基本数据类型的一些问题和总结

    我们输入以下代码: public class DataType07 { public static void main(String[]args){ byte b1 = 4; byte b2 = 5; ...

  8. 三、JavaSE语言基础之数据类型

    数据类型的分类   按照数据的复杂程度可分为引用数据类型与基本数据类型   引用数据类型的数据是对象(多值数据/复杂数据),引用数据类型的数据的名字叫做引用/引用名:   基本数据类型的数据是常量值( ...

  9. 北京大学Cousera学习笔记--7-计算导论与C语言基础--基本数据类型&变量&常量

    1.整形数据 1.基本型(int 4B).短整型(short 2B).长整型(long 4B)  VC环境下 sizeof运算符用于计算某种类型的对象在内存中所占的字节数 ,用法:size(int) ...

随机推荐

  1. ASE19团队项目alpha阶段model组 scrum7 记录

    本次会议于11月11日,19时整在微软北京西二号楼sky garden召开,持续15分钟. 与会人员:Jiyan He, Kun Yan, Lei Chai, Linfeng Qi, Xueqing ...

  2. 【Java并发】并发队列与线程池

    并发队列 阻塞队列与非阻塞队 ConcurrentLinkedQueue BlockingQueue ArrayBlockingQueue LinkedBlockingQueue PriorityBl ...

  3. Servlet和JSP学习总结

    目录 Jsp会被编译成servlet,在页面被第一次访问的时候 Jsp中可以在html页面中嵌入java代码或者引入jsp标签 可以在html中引入自定义标签 Web工程的目录结构 Jsp的注释 Js ...

  4. PAT Advanced 1153 Decode Registration Card of PAT (25 分)

    A registration card number of PAT consists of 4 parts: the 1st letter represents the test level, nam ...

  5. 基本算法 st

    今天困得不行,就看了个小算法st,其实和线段树的作用一样, 不过这个算法没有用到数据结构,使用二进制优化的 是O(log(n)n)的时间预处理,然后以O(1)的时间返回(l,r)上的最大或最小 #in ...

  6. 【LOJ6671】EntropyIncreaser 与 Minecraft

    Orz lbt Description https://loj.ac/problem/6671 Solution

  7. gerapy+scrapyd组合管理分布式爬虫

    Scrapyd是一款用于管理scrapy爬虫的部署和运行的服务,提供了HTTP JSON形式的API来完成爬虫调度涉及的各项指令.Scrapyd是一款开源软件,代码托管于Github上. 点击此链接h ...

  8. ubuntu18系统 Qt Error BadAccess

    现象:在ubuntu18中报错 X Error: BadAccess (attempt to access private resource denied) 10  Extension:    130 ...

  9. C# 之 .net core -- EF code first连接Mysql数据库

    一.在Models 新建两个数据库类 这个是数据库需要生成的类基础(塑造外观) public class User { [Key] public string ID { get; set; } [Ma ...

  10. 通过LVM备份mysql数据库脚本

    #!/bin/bash #******************************************************************** #encoding -*-utf8- ...