Go数据类型

1 基础数据类型

1.1 整型

  • 有符号整数类型:int8、int16、int32和int64
  • 无符号整数类型:uint8、uint16、uint34和uint64
  • 无符号的整数类型uintptr:没有指定具体的bit大小但是足以容纳指针
    nt、uint和uintptr是不同类型的兄弟类型。
    其中int和int32也是不同的类型,即使int的大小也是32bit。
    下面是Go语言中关于算术运算、逻辑运算和比较运算的二元运算符,它们按照优先级递减的顺序排列:
*      /      %      <<       >>     &       &^
+      -      |      ^
==     !=     <      <=       >      >=
&&
||

前面4个操作运算符并不区分是有符号还是无符号数:

&      位运算 AND
|      位运算 OR
^      位运算 XOR
&^     位清空 (AND NOT)
<<     左移
>>     右移

Printf函数的%b参数打印二进制格式的数字;其中%08b中08表示打印至少8个字符宽度,不足的前缀部分用0填充。

1.2 浮点数

  • float32类型的浮点数可以提供大约6个十进制数的精度。
  • float64则可以提供约15个十进制数的精度
    (float32的有效bit位只有23个,其它的bit位用于指数和符号;当整数大于23bit能表达的范围时,float32的表示将出现误差)

1.3 复数

complex64和complex128,分别对应float32和float64两种浮点数精度。
内置的complex函数用于构建复数。
内建的real和imag函数分别返回复数的实部和虚部。

var x complex128 = complex(1, 2) // 1+2i
var y complex128 = complex(3, 4) // 3+4i
fmt.Println(x*y)                 // "(-5+10i)",z1 × z2=(ac-bd,bc+ad),z1 + z2=(a+c,b+d)
fmt.Println(real(x*y))           // "-5"
fmt.Println(imag(x*y))           // "10"

1.4 布尔型

一个布尔类型的值只有两种:true和false。
if和for语句的条件部分都是布尔类型的值。
操作符:&&(AND)和||(OR)

1.5 字符串

一个字符串是一个不可改变的字节序列。
内置的len函数可以返回一个字符串中的字节数目(不是rune字符数目)。
索引操作s[i]返回第i个字节的字节值,i必须满足0 ≤ i< len(s)条件约束。

s := "hello, world"
fmt.Println(len(s))     // "12"
fmt.Println(s[0], s[7]) // "104 119" ('h' and 'w')
fmt.Println(string(s[0]), string(s[7])) // "h w"

子字符串操作s[i:j]基于原始的s字符串的第i个字节开始到第j个字节(并不包含j本身)生成一个新字符串。生成的新字符串将包含j-i个字节。

fmt.Println(s[:5]) // "hello"
fmt.Println(s[7:]) // "world"
fmt.Println(s[:])  // "hello, world"

变量s将因为+=语句持有一个新的字符串值

s := "left foot"
s += ", right foot"
1.5.1 字符串面值

在一个双引号包含的字符串面值中,可以用以反斜杠\开头的转义序列插入任意的数据。

\a      响铃
\b      退格
\f      换页
\n      换行
\r      回车
\t      制表符
\v      垂直制表符
\'      单引号 (只用在 '\'' 形式的rune符号面值中)
\"      双引号 (只用在 "..." 形式的字符串面值中)
\\      反斜杠

一个原生的字符串面值形式是...,使用反引号代替双引号。
在原生的字符串面值中,没有转义操作;全部的内容都是字面的意思,包含退格和换行,因此一个程序中的原生字符串面值可能跨越多行。
原生字符串面值用于编写正则表达式,HTML模板、JSON面值、命令行提示信息以及那些需要扩展到多行的场景

1.5.2 字符串和Byte切片

标准库中有四个包对字符串处理尤为重要:bytes、strings、strconv和unicode包。

  • strings包提供了许多如字符串的查询、替换、比较、截断、拆分和合并等功能。
  • bytes包也提供了很多类似功能的函数,但是针对和字符串有着相同结构的[]byte类型。
  • strconv包提供了布尔型、整型数、浮点数和对应字符串的相互转换,还提供了双引号转义相关的转换。
  • unicode包提供了IsDigit、IsLetter、IsUpper和IsLower等类似功能,它们用于给字符分类。
    当向bytes.Buffer添加任意字符的UTF8编码时,最好使用bytes.Buffer的WriteRune方法,但是WriteByte方法对于写入类似’[‘和’]'等ASCII字符则会更加有效。

1.6 常量

每种常量的潜在类型都是基础类型:boolean、string或数字。
例子:

const pi = 3.14159 // approximately; math.Pi is a better approximation
const (
    a = 1
    b
    c = 2
    d
)

fmt.Println(a, b, c, d) // "1 1 2 2"
1.6.1 iota常量生成器

常量声明可以使用iota常量生成器初始化,它用于生成一组以相似规则初始化的常量,但是不用每行都写一遍初始化表达式。

type Weekday int

const (
    Sunday Weekday = iota
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
)

周日将对应0,周一为1,如此等等。

2 复合数据类型

2.1 数组

数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。
因为数组的长度是固定的,因此在Go语言中很少直接使用数组。和数组对应的类型是Slice(切片)

var a [3]int             // array of 3 integers
fmt.Println(a[0])        // print the first element
fmt.Println(a[len(a)-1]) // print the last element, a[2]

// Print the indices and elements.
for i, v := range a {
    fmt.Printf("%d %d\n", i, v)
}

// Print the elements only.
for _, v := range a {
    fmt.Printf("%d\n", v)
}
var q [3]int = [3]int{1, 2, 3}
var r [3]int = [3]int{1, 2}
fmt.Println(r[2]) // "0"

如果在数组的长度位置出现的是“…”省略号,则表示数组的长度是根据初始化值的个数来计算。

q := [...]int{1, 2, 3}
fmt.Printf("%T\n", q) // "[3]int"

2.2 Slice

Slice(切片)代表变长的序列,序列中每个元素都有相同的类型。
一个slice由三个部分构成:指针、长度和容量。
内置的len和cap函数分别返回slice的长度和容量。

months := [...]string{1: "January", /* ... */, 12: "December"}
s := []int{0, 1, 2, 3, 4, 5}
2.2.1 append函数

内置的append函数用于向slice追加元素:

var runes []rune
for _, r := range "Hello, 世界" {
    runes = append(runes, r)
}
fmt.Printf("%q\n", runes) // "['H' 'e' 'l' 'l' 'o' ',' ' ' '世' '界']"

2.3 Map

在Go语言中,一个map就是一个哈希表的引用,map类型可以写为map[K]V,其中K和V分别对应key和value。map中所有的key都有相同的类型,所有的value也有着相同的类型,但是key和value之间可以是不同的数据类型。
内置的make函数可以创建一个map:

ages := make(map[string]int)
ages["alice"] = 31
ages["charlie"] = 34

这相当于

ages := map[string]int{
    "alice":   31,
    "charlie": 34,
}

使用内置的delete函数可以删除元素:

delete(ages, "alice") // remove element ages["alice"]

使用range风格的for循环实现遍历map

for name, age := range ages {
    fmt.Printf("%s\t%d\n", name, age)
}

2.4 结构体

结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体。每个值称为结构体的成员。

type Employee struct {
    ID        int
    Name      string
    Address   string
    DoB       time.Time
    Position  string
    Salary    int
    ManagerID int
}

var dilbert Employee
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值