目录
一:类型分类
go的数据类型包含11种,可以分为以下四类。
1:基础类型:布尔,数字和字符串:
2:复合类型:数组和结构体
3:引用类型: 指针,channel通道,切片,map字典,函数
4:接口类型
二:介绍
1:布尔
一个布尔类型的值只有两种:true 或 false
package main
import (
"fmt"
)
func main() {
var a bool = true
var b bool = false
fmt.Println(a,b)
}
2:字符串
可以使用双引号""来定义字符串,字符串中可以使用转义字符来实现换行、缩进等效果。
var a string = "xiao mi"
fmt.Println(a)
字符串的拼接可以用加号+
var a string = "xiao mi"
var b string = "is good"
fmt.Println(a+b)
换行实现
var a string = "xiao mi \n"
var b string = "is good"
fmt.Println(a+b)
特殊字符原样输出用反引号
var a string = `\nxiaomi`
3:数字类型
整型分为两类:无符号、有符号;
支持两种浮点型数:float32和float64。打印浮点数时,可以使用fmt包配合%f,代码如下:
f1 := 3.14159
fmt.Printf("%T\n", f1) //默认Go语言中的小数都是float64
4:数组
数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。因为数组的长度是固定的,所以在Go语言中很少直接使用数组。
数组的声明:
var 数组变量名 [元素数量]Type
var arr [10]int64
fmt.Println(arr)
遍历数组:
var arr [10]int64
for k,v := range arr {
fmt.Println(k,v)
}
比较数组:要求数组的长度和数组的元素类型相同
a := [2]int{1, 5}
b := [...]int{1, 5}
c := [2]int{1, 7}
fmt.Println(a == b, a == c, b == c)
5:结构体
结构体是由零个或多个任意类型的值聚合成的实体,每个值都可以称为结构体的成员。
构体的定义只是一种内存布局的描述,只有当结构体实例化时,才会真正地分配内存。
结构体的定义格式如下:
type 类型名 struct {
字段1 类型
字段2 类型
…
}
比如定义一个商品的结构体:
type goods struct {
name string
price float64
}
实例化结构体
var g goods
g.name = "鹌鹑蛋"
g.price = 16.6
fmt.Println(g)
使用键值对初始化
good := &goods{
name:"鸡蛋",
price:23.93}
使用列表初始化
good := goods{
"鸡蛋",
23.93}
6:指针
指针也就是所说的内存地址,内存地址保存在指针变量里
指针定义:
var p *int 定义一个int类型的指针变量p
指针的使用
var num int = 11
var p *int
p = &num 把地址赋值给指针类型p
fmt.Println(*p) 获取指针指向地址存储的值
fmt.Println(p) 获取指针指向的地址
7:切片
声明:
var a []int
make方法创建:
s3 := make([]int, 3, 5)
追加元素:
s3 = append(s3, 1)
切片拷贝:
s1 := make([]int, 4, 5)
s2 := []int{5, 4, 3}
copy(s1, s2)
fmt.Println(s1)
多维切片:
s1 := [][]int{{10}, {100, 200}}
8:字典
map 是一种特殊的数据结构,一种元素对(pair)的无序集合,pair 对应一个 key(索引)和一个 value(值),所以这个结构也称为关联数组或字典,这是一种能够快速寻找值的理想结构,给定 key,就可以迅速找到对应的 value。
定义:
dict1 := make(map[string]int)
dict1["name"] = 66
dict1["aget"] = 4
遍历:
for k, v := range dict1 {
fmt.Println(k, v)
}
删除:
delete(dict1 , "name")
9:函数
声明:
func 函数名(形式参数列表)(返回值列表){
函数体
}
例如:
10:通道
Go语言中的通道(channel)是一种特殊的类型。在任何时候,同时只能有一个 goroutine 访问通道进行发送和获取数据。goroutine 间通过通道就可以通信。
通道像一个传送带或者队列,总是遵循先入先出(First In First Out)的规则,保证收发数据的顺序。
声明:
var 通道变量 chan 通道类型
创建:
通道实例 := make(chan 数据类型)
ch1 := make(chan int)
发送接收数据示例:
ch := make(chan interface{})
go func() {
for i := 0; i <= 5; i++ {
ch <- i
// 每次发送完时等待
time.Sleep(time.Second)
}
}()
// 遍历接收通道数据
for data := range ch {
fmt.Println(data)
// 当遇到数据5时, 退出接收循环
if data == 5 {
break
}
}
11:接口
定义:
type 接口类型名 interface{
方法名1( 参数列表1 ) 返回值列表1
方法名2( 参数列表2 ) 返回值列表2
…
}