《Go语言原来这么简单》 -- 基本数据类型

744 阅读7分钟

「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战

基本数据类型

整型

整型分为以下两个大类:
按长度分为:int8、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)

特殊整型

类型描述
uint32位操作系统上就是uint32,64位操作系统上就是uint64
int32位操作系统上就是int32,64位操作系统上就是int64
uintptr无符号整型,用于存放一个指针

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

关于初始化的问题: 在上一篇中变量的初始化 a:=100 这时a的默认类型即为 int 是随操作系统位数改变而改变的

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

数字字面量语法(Number literals syntax)

Go1.13版本之后引入了数字字面量语法,目的是为了开发者可以用二进制,八进制,十六进制等来定义数据。例如:在汇编语言中大部分都是使用的十六进制进行编码

0b开头代表二进制,v := 0b00101101, 代表二进制的 101101(4位一组表示,可以很好地转换成十六进制),相当于十进制的 45。
0o0开头代表八进制,v := 0o377,代表八进制的 377,相当于十进制的 255。
0x开头代表十六进制,v := 0x1p-2,代表十六进制的 1 除以 2²,也就是 0.25。

而且还允许我们用 _ 来分隔数字,比如说: v := 123_456 表示 v 的值等于 123456。

我们可以借助fmt函数来将一个整数以不同进制形式展示。

package main

import "fmt"

func main() {

   b := 0b10010
   fmt.Printf("二进制 0b%b,十进制%d \n", b, b) //二进制 0b10010,十进制18 

   o := 0123
   fmt.Printf("八进制 0o%o,十进制%d \n", o, o)//八进制 0o123,十进制83 

   x := 0x123
   fmt.Printf("十六进制 0x%X,十进制%d \n", x, x)//十六进制 0x123,十进制291 

}

浮点型

Go语言支持两种浮点型数:float32float64。这两种浮点型数据格式遵循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)  //默认保留小数点后6位
        fmt.Printf("%.2f\n", math.Pi)
}

复数

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

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

在一些数学计算中复数是很常见的 例如 |3+4i| =32+42\sqrt{3^2+4^2} = 5
欧拉公式eiπ+1=0e^{iπ} + 1=0 等等

go 语言表达欧拉公式

fmt.Println(cmplx.Exp(1i*math.Phi)+1)

因为计算机浮点数是不准确的 所以结果还存在虚部而不是 0

布尔值

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

注意:

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

字符串

字符串中有很多特殊字符 例如 回车,换行等,在go中需进行转义

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

例如在window下路径就可写成fmt.Println("c:\\") 否则会报错

多行字符串

当我们需要进行多行字符串的打印,例如打印古诗 《咏鹅》 正常的方式为

e := "\t\t咏鹅\n【作者】骆宾王 【朝代】唐译文对照\n\t鹅鹅鹅,\t曲项向天歌。\n\t白毛浮绿水,\t红掌拨清波。"
fmt.Println(e)

这种方式效果太差而使用多行字符串

e :=
   `           咏鹅
                  【作者】骆宾王
                鹅鹅鹅,   曲项向天歌。
               白毛浮绿水,    红掌拨清波。`
fmt.Println(e)

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

所以这种也可以用来打印上面所说的windows路径

字符串的常用操作

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

byte和rune类型

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

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

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

  1. uint8类型,或者叫 byte 型,代表了ASCII码的一个字符。
  2. rune类型,代表一个 UTF-8字符,类似于其他语言的char类型。 当需要处理中文、日文或者其他复合字符时,则需要用到rune类型。rune类型实际是一个int32,所以说runeint32的别名。 它用于区分字符值和整数值
    UTF-8编码最长为四个字节,那么刚好对应一个int32
    Go 使用了特殊的 rune 类型来处理 Unicode,让基于 Unicode 的文本处理更为方便,也可以使用 byte 型进行默认字符串处理,性能和扩展性都有照顾。

字符串的遍历

字符串的遍历有两种方式 一种是 for i 另一种是 for range 的方式这里的区别在于 for i遍历的是 []byte 而 for range遍历的是[]rune

// 遍历字符串
func traversalString() {
   s := "Hi,派大星"
   for i := 0; i < len(s); i++ { //byte
      fmt.Printf("%v(%c)(%T) ", s[i], s[i], s[i])
   }
   fmt.Println()
   for _, r := range s { //rune
      fmt.Printf("%v(%c)(%T) ", r, r, r)
   }
   fmt.Println()
}

修改字符串

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

carbon (12).png

强制类型转换

在go 语言中不同类型的转换必须显示的进行

carbon (13).png

如果a,b定义为常量,name内部float64 就无须强制转换。const数值可以作为任意类型使用

总结

基本数据类型与其他语言并没有很大的差异,其中着重要了解的就是 byterune