Go语言基础 - 基本数据类型

一、基本数据类型

1. 整型

uint8也就是byte

无符号整型 取值范围
uint8 0 到 255
uint16 0 到 65535
uint32 0 到 4294967295
uint64 0 到 18446744073709551615

int16对应C语言中的short型,int64对应C语言中的long

有符号整型 取值范围
int8 -128 到 127
int16 -32768 到 32767
int32 -2147483648 到 2147483647
int64 -9223372036854775808 到 9223372036854775807

a. 特殊整型

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

特殊整型 描述
uint 32位操作系统上就是uint32,64位操作系统上就是uint64
int 32位操作系统上就是int32,64位操作系统上就是int64
uintptr 无符号整型,长度被设定为足够存放一个指针

b. 数字字面量语法

const a = 0b00001101 // 二进制1101 == 十进制13
const b = 0333       // 0333 == 0o333,八进制333 == 十进制 64 * 3 + 3 * 8 + 3 = 219
const c = 0xAF       // 十六进制AF == 十进制 10 * 16 + 15 = 175

2. 浮点型

  • float32精确到小数点后7位,最大范围可以使用常量定义:math.MaxFloat32
  • float64精确到小数点后15位,最大范围可以使用常量定义:math.MaxFloat64。并且尽可能地使用float64,因为math包中所有有关数学运算的函数都会要求接收这个类型
  • 使用==或者!=来比较浮点数时应当非常小心,最好在正式使用前测试对于精确度要求较高的运算

3. 复数

复数使用re+imI来表示,其中re代表实数部分,im代表虚数部分,I代表根号负1

  • complex64,32位实数和虚数
  • complex128,64位实数和虚数;最好使用complex128作为计算类型,因为相关函数都使用这个类型的参数。
var c1 complex64 = 5 + 10i // 5 + 10i == complex(5, 10)
fmt.Printf("输出:%v", c1) // 输出:5+10i

4. 布尔值

布尔型数据只有truefalse两个值,默认为false

5、字符串

字符串是一种值类型,且值不可变,更深入地讲,字符串是byte类型的固定长度数组。

Go语言支持以下2种形式字符串:

  1. 解释字符串

    该类字符串使用双引号括起来,其中的相关的转义字符将被替换,这些转义字符包括:

    • \n:换行符
    • \r:回车符
    • \t:tab 键
    • \u\U:Unicode字符
    • \\:反斜杠自身
    • \':单引号
    • \":双引号
  2. 非解释字符串

    该类字符串使用反引号括起来,支持换行,例如:

    package main
    
    import "fmt"
    
    func main() {
        const a = `\n:这里不会换行
    这里才会`
    
        // `\n:这里不会换行
        // 这里才会` 作为一个完整的字符串原样输出
        fmt.Println(a)
    }

字符串拼接符+

a := "我是A" + ",我5岁"
a += ",身高180cm"
fmt.Println(a) // 我是A,我5岁,身高180cm

字符:byterune类型

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

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

  1. uint8类型,或者叫byte型,代表了ASCII码的一个字符
  2. rune类型,代表一个UTF-8字符,rune类型实际是一个int32

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

s := "byte,no,rune我是"

for i := 0; i < len(s); i++ { //byte
    fmt.Printf("%v(%c) ", s[i], s[i])
}
fmt.Println()

for _, r := range s { //rune
    fmt.Printf("%v(%c) ", r, r)
}
fmt.Println()

// 98(b) 121(y) 116(t) 101(e) 44(,) 110(n) 111(o) 44(,) 114(r) 117(u) 110(n) 101(e) 230(æ) 136() 145() 230(æ) 152() 175(¯)
// 98(b) 121(y) 116(t) 101(e) 44(,) 110(n) 111(o) 44(,) 114(r) 117(u) 110(n) 101(e) 25105(我) 26159(是)

因为UTF-8编码下一个中文汉字由3~4个字节组成,所以我们不能简单的按照字节去遍历一个包含中文的字符串,否则就会出现上面输出中第一行的结果。

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

二、类型转换

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

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

参考文献

你可能感兴趣的:(golang)