大家好我是小西,从今天开始,我将开始更新Go基础篇的笔记
预计有5篇,基础篇写完了,再写应用篇,大致是这个计划
老手可以回顾回顾 ,温故知新~ 新手可以收藏一下 做个参考
今天更新第二篇,内容是 Go 更多高级的类型
指针
指针中保存的了值的内存地址,所以指针是地址
var p *int // 声明指针i := 42 :p = &I // 指针初始化
使用 *完成读和写操作
fmt.Println(*p) // read i through the pointer p*p = 21 // set i through the pointer p
Go中指针,没有运算,就这些
结构体 Structs
type Vertex struct { X int Y int}
使用 type name struct {} 来定义结构体
指针也可以指向结构体,使用 .Field 来读写属性
结构体初始化v1 = Vertex{1, 2}v2 = Vertex{X: 1} // Y属性自动赋值为0
数组
定义a 是一个数组,长度为10,这个长度是数组类型的一部分,不可变
var a [10]intprimes := [6]int{2, 3, 5, 7, 11, 13}
切片Slices
primes := [6]int{2, 3, 5, 7, 11, 13}var s []int = primes[1:4] // 基于数组定义切片
切片自己不保存数据,只是数组一个视图
修改切片中的值会修改原数组:
package mainimport "fmt"funcmain() {names := [4]string{ "John", "Paul", "George", "Ringo",}fmt.Println(names)a := names[0:2]b := names[1:3]fmt.Println(a, b)b[0] = "XXX"fmt.Println(a, b)// names 也会改变fmt.Println(names)}
快速创建的切片
q := []int{2, 3, 5, 7, 11, 13}
切片有 length 和 capacity 两个属性,可以使用len(s) 和 cap(s) 来获取
分别对应切片的长度和切片底层数组的长度
切片的零值是 nil, 这是不可用的
你可以使用 make 来创建可用的切片
a := make([]int, 5)len 和 cap 为5的切片
b := make([]int, 0, 5) len 为 0 cap 为 5的切片
切片中可以包含其它切片
board := [][]string{ []string{"_", "_", "_"}, []string{"_", "_", "_"}, []string{"_", "_", "_"},}
内置函数 append 可往切片中追加元素,当背后的数组长度不够,
会新分配一个底层数组
func append(s []T, vs ...T) []T
遍历 slice 可以用 for range
var pow = []int{1, 2, 4, 8, 16, 32, 64, 128}funcmain() { for i, v := range pow { fmt.Printf("2**%d = %d\n", i, v) }}
不需要的值可以使用 _
Map
用于保存健值对的类型
type Vertex struct { Lat, Long float64}var m map[string]Vertex
Map 的初始化也使用make
m = make(map[string]Vertex)
也可以使用字面量,直接定义内容,
因为外层已经有 Vertex 结构体名,内部的 Vertex 可以省略
var m = map[string]Vertex{"Bell Labs": Vertex{ 40.68433, -74.39967,},"Google": Vertex{ 37.42202, -122.08408,},}var m = map[string]Vertex{ "Bell Labs": {40.68433, -74.39967}, "Google": {37.42202, -122.08408},}
读取和修改直接用 m[key]就可以了
Go还支持map的存在性检测,不需要额外函数
elem, ok = m[key]
如果 key 存在 ,ok 则为 true
函数值
hypot := func(x, y float64) float64 { return math.Sqrt(x*x + y*y)}
可以这个定义一个函数
函数也可以接收另一个函数, fn是外部传入的函数
funccompute(fn func(float64, float64) float64) float64 { return fn(3, 4)}funcadder() func(int) int { sum := 0 return func(x int) int { sum += x return sum}}
调用adder 会返回一个闭包函数,这个函数保留了对 sum 的引用,当外层函数 adder 执行完成后
最后是一个练习,使用闭包函数输出斐波那契数组
package mainimport "fmt"// fibonacci is a function that returns// a function that returns an int.funcfibonacci() func() int { a, b := 0, 1 return func() int { result := a a, b = b, a+b return result }}funcmain() { f := fibonacci() for i := 0; i < 10; i++ { fmt.Println(f()) }}
感谢你看到这,如果本文对你有帮助,记得给我一个赞哦~
原文链接 中我放了 Go Tour 的链接,你可以看看