2.go语言基础类型漫游
阅读原文时间:2023年08月20日阅读:3

本篇前瞻

本篇是go语言的基础篇,主要是帮助大家梳理一下go语言的基本类型,注意本篇有参考go圣经,如果你有完整学习的需求可以看一下,另外,go语言的基本类型比较简单,介绍过程就比较粗暴。

基本类型

这个不是韩国的“绝学”——整形术,整形在编程中可以表示一定范围内的整数

注意:int或uint的占用空间取决于你的操作系统是32位或64位

对于整形我们要关注的是数据类型的长度,数据范围

代码如下:

package main

import (
    "fmt"
    "math"
    "unsafe"
)

func main() {
    fmt.Printf("int8   length: %v range: %v ~ %v\n", unsafe.Sizeof(int8(1)), math.MinInt8, math.MaxInt8)
    fmt.Printf("int16  length: %v range: %v ~ %v\n", unsafe.Sizeof(int16(1)), math.MinInt16, math.MaxInt16)
    fmt.Printf("int32  length: %v range: %v ~ %v\n", unsafe.Sizeof(int32(1)), math.MinInt32, math.MaxInt32)
    fmt.Printf("int64  length: %v range: %v ~ %v\n", unsafe.Sizeof(int64(1)), math.MinInt64, math.MaxInt64)
    fmt.Printf("int    length: %v\n", unsafe.Sizeof(int(1)))

    fmt.Printf("uint8  length: %v range: 0 ~ %v\n", unsafe.Sizeof(uint8(1)), math.MaxUint8)
    fmt.Printf("uint16 length: %v range: 0 ~ %v\n", unsafe.Sizeof(uint16(1)), math.MaxUint16)
    fmt.Printf("uint32 length: %v range: 0 ~ %v\n", unsafe.Sizeof(uint32(1)), math.MaxUint32)
    fmt.Printf("uint64 length: %v range: 0 ~ %v\n", unsafe.Sizeof(uint64(1)), uint64(math.MaxUint64))
    fmt.Printf("uint   length: %v\n", unsafe.Sizeof(uint(1)))
}

输出:

int8   length: 1 range: -128 ~ 127
int16  length: 2 range: -32768 ~ 32767
int32  length: 4 range: -2147483648 ~ 2147483647
int64  length: 8 range: -9223372036854775808 ~ 9223372036854775807
int    length: 8
uint8  length: 1 range: 0 ~ 255
uint16 length: 2 range: 0 ~ 65535
uint32 length: 4 range: 0 ~ 4294967295
uint64 length: 8 range: 0 ~ 18446744073709551615
uint   length: 8

有符号整形

这种整形就是可以表示负整数,0和正整数

数据类型

占用空间(bit)

长度(字节)

取值范围

int8

8

1

-2^7 ~ 2^7-1(-128~127)

int16

16

2

-2^15 ~ 2^15-1(-32768 ~ 32767)

int32

32

4

-2^32 ~ 2^32-1(-2147483648 ~ 2147483647)

int64

64

8

-2^64 ~ 2^64-1(-9223372036854775808 ~ 9223372036854775807)

int

32或64

4或8

同int32或int64

无符号整形

这种整形就是可以表示非负整数

数据类型

占用空间(bit)

长度(字节)

取值范围

uint8

8

1

0 ~ 2^8-1(0 ~ 255)

uint16

16

2

0 ~ 2^16-1(0 ~ 65535)

uint32

32

4

0 ~ 2^32-1(0 ~ 4294967295)

uint64

64

8

0 ~ 2^64-1(0 ~ 18446744073709551615)

uint

32或64

4或8

同uint32或uint64

浮点型在编程中可以表示一定范围内的实数

注意:对于浮点型我们要关注的是数据类型的长度,数据范围,但更要关注精度。

代码如下:

package main

import (
    "fmt"
    "math"
    "unsafe"
)

func main() {
    fmt.Printf("float32 length: %v range: %v ~ %v\n", unsafe.Sizeof(float32(1)), -math.MaxFloat32, math.MaxFloat32)
    fmt.Printf("float64 length: %v range: %v ~ %v\n", unsafe.Sizeof(float64(1)), -math.MaxFloat64, math.MaxFloat64)
    fmt.Printf("after transfer float32 %v\n", float32(1.328))
    fmt.Printf("after transfer float64 %v\n", float64(float32(1.328)))
}

输出:

float32 length: 4 range: -3.4028234663852886e+38 ~ 3.4028234663852886e+38
float64 length: 8 range: -1.7976931348623157e+308 ~ 1.7976931348623157e+308
before transfer float32: 1.328
after  transfer float64: 1.3279999494552612

你可以看到1.328在float32强制转化为float64反常地失去了一些精度,当然这就是为啥项目和数据库只有高精度实数的原因,你可以想象在这种情况时使用乘法后可怕的结果。

至于这个产生的原因时浮点32型和浮点64型在计算机上表示方式不同,这部分内容你可以查看《计算机程序的构造和解释》。

列表如下:

数据类型

占用空间(bit)

长度(字节)

取值范围

float32

32

4

-3.4028234663852886e+38 ~ 3.4028234663852886e+38

float64

64

8

-1.7976931348623157e+308 ~ 1.7976931348623157e+308

最简单的类型

注意:分支语句中的if后面的表达式的结果值是true或false

代码如下:

package main

import (
    "fmt"
    "unsafe"
)

func main() {
    fmt.Printf("bool length: %v %v/%v", unsafe.Sizeof(true), 0 == 0, 0 != 0)
}

输出:

bool length: 1 true/false

列表如下:

数据类型

占用空间(bit)

长度(字节)

取值范围

bool

1

1

true/false

注意:byte是包含ascii码,即uint8 ,rune是可以包含utf-8的,即uint32**

代码如下:

package main

import (
    "fmt"
    "unsafe"
)

func main() {
    fmt.Printf("byte length: %v %v %c\n", unsafe.Sizeof(byte('a')),byte('a'),byte('a'))
    fmt.Printf("rune length: %v %v %c\n", unsafe.Sizeof(rune('中')),rune('中'),rune('中'))
}

输出:

byte length: 1 97 a
rune length: 4 20013 中

列表如下:

数据类型

占用空间(bit)

长度(字节)

取值范围

byte

8

1

0 ~ 2^8-1(0 ~ 255)

rune

32

4

0 ~ 2^32-1(0 ~ 4294967295)

本篇小结

本篇主要介绍了go语言的基本类型,每个类型都有自己的长度,取值范围和注意点,相关内容在go语言学习中,等我们学习了go语言的控制结构后来看看相关的取值范围的威力

下一篇预告

go语言的控制结构