map
Map 是一种无序的键值对的集合,遍历 Map 时返回的键值对的顺序是不确定的。
Map 是通过 key 来快速检索数据,key 类似于索引,指向数据的值。
// 创建一个空的 Map
m := make(map[string]int)
// 创建一个初始容量为 10 的 Map
m := make(map[string]int, 10)
// 使用字面量创建 Map
m := map[string]int{
"apple": 1,
"banana": 2,
"orange": 3,
}
// 获取键值对
v1 := m["apple"]
v2, ok := m["pear"] // 如果键不存在,ok 的值为 false,v2 的值为该类型的零值
// 修改键值对
m["apple"] = 5
// 获取 Map 的长度
len := len(m)
// 遍历 Map
for k, v := range m {
fmt.Printf("key=%s, value=%d\n", k, v)
}
// 删除键值对
delete(m, "banana")
range
range 关键字用于 for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。在数组和切片中它返回元素的索引和索引对应的值,在集合中返回 key-value 对。key 和 value 是可以省略
for _, value := range oMap
for key, _ := range oMap
函数
函数定义后可作为另外一个函数的实参数传入
/* 声明函数变量 */
getSquareRoot := func(x float64) float64 {
return math.Sqrt(x)
}
闭包是匿名函数,可在动态编程中使用
func getSequence() func() int {
i:=0
return func() int {
i+=1
return i
}
}
递归函数,递归,就是在运行的过程中调用自己。
func recursion() {
recursion() /* 函数调用自身 */
}
func main() {
recursion()
}
指针
变量是一种使用方便的占位符,用于引用计算机内存地址,一个指针变量指向了一个值的内存地址。
Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。
var ip *int /* 指向整型*/
var fp *float32 /* 指向浮点型 */
指针使用流程:
- 定义指针变量。
- 为指针变量赋值。
- 访问指针变量中指向地址的值。
var a int= 20 /* 声明实际变量 */
var ip *int /* 声明指针变量 */
ip = &a /* 指针变量的存储地址 */
/* 使用指针访问值 */
fmt.Printf("*ip 变量的值: %d\n", *ip )
// *ip 变量的值: 20
结构体
Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。
结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。
// 定义结构体
type Books struct {
book_id int
}
// 创建一个结构体
a:=Books{book_id:1}
访问结构体成员,需要使用点号 . 操作符
// 声明 Book1 为 Books 类型
var Book1 Books
Book1.book_id = 22
fmt.Printf(Book1)
结构体指针
var Book1 *Books
a: = &Book1
结构体方法
type Books struct {
book_id int
}
func (b Books) checkBookid(book_id int) bool{
return b.book_id == book_id
}
func (b *Books) resetBookid(book_id int) {
b.book_id == book_id
}
func main(){
a:=Book{book_id:1}
a.resetBookid(2)
fmt.Println(a.checkBookid(2))
}
错误处理
Go 语言通过内置的错误接口提供了非常简单的错误处理机制。
type error interface {
Error() string
}
函数通常在最后的返回值中返回错误信息。使用 errors.New 可返回一个错误信息
func Sqrt(f float64) (float64, error) {
if f < 0 {
return 0, errors.New("math: square root of negative number")
}
// 实现
}
func main(){
result, err:= Sqrt(-1)
if err != nil {
fmt.Println(err)
}
}