diff --git a/blog/golang/golang-function.md b/blog/golang/golang-function.md new file mode 100644 index 0000000000000000000000000000000000000000..106233add8a7fa282eb4f92031114db206cb7431 --- /dev/null +++ b/blog/golang/golang-function.md @@ -0,0 +1,297 @@ +# 第十五章 Golang 函数 + +## Go语言函数特性 + +1. 函数分类: +- 普通函数 +- 匿名函数 +- 方法 + +2. 函数不能重载,即不允许函数同名 +3. 函数不能嵌套函数,但可以嵌套匿名函数 +4. 函数可以赋值给变量 +5. 函数可以作为参数传递给另一个函数 +6. 函数的返回值可以是一个函数 +7. 函数传参传递是参数的副本 +8. 函数参数可以没有名称 + +## 函数定义 + +```go +func function_name([parameter list])[return_type] { + // 函数体 +} +``` + +示例 + +```go +package main + +import "fmt" + +func sum(a int, b int) (ret int) { + return a + b +} + +func main() { + r := sum(1, 1) + fmt.Printf("%v", r) + // 2 +} + +``` + +## 函数返回值 + +没有返回值 + +```go +func foo(){ + fmt.Println("Hello") +} +``` + +一个返回值 + +```go +func sum(a int, b int) (ret int) { + return a + b +} +``` + +多个返回值 + +```go +func foo() (name string, age int) { + return "Tom", 23 +} + +// 省略命名 +func foo() (string, int) { + return "Tom", 23 +} +``` + +多值返回常用于函数返回错误 +``` +value, exists +value, ok +value, err +``` + +返回值过多(4个以上),通常放在容器中返回 + +``` +同类型 slice +不同类型 map +``` + +返回值不想使用,可以使用 `_` 丢弃 + +## 函数参数 + +参数类型: +- 形参 声明函数时的参数列表 +- 实参 调用时传递的参数 + +特点: + +- 参数可以0个或者有多个,需要指定数据类型 +- 函数是传值的方式进行传参 +- 可以使用变长参数`...` + +示例 +```go +package main + +import "fmt" + +// a, b形参 +func sum(a int, b int) (ret int) { + return a + b +} + +func main() { + // 1, 1 实参 + r := sum(1, 1) + fmt.Printf("%v", r) + // 2 +} + +``` + +注意: + +- map、slice、interface、channel数据类型是指针,拷贝的是指针,有可能会改变原始数据 + +```go +package main + +import "fmt" + +func foo(arr []int) { + arr[0] = 100 +} + +func main() { + + a := []int{1, 2, 3} + + foo(a) + + fmt.Printf("%v", a) + // [100 2 3] +} + +``` + +变长参数 + +```go +package main + +import "fmt" + +func foo(args ...int) { + for _, value := range args { + fmt.Printf("%v ", value) + } +} + +func main() { + + foo(1, 2, 3) + + // 1 2 3 +} + +``` + + +多种参数混合使用 + +```go +package main + +func foo(name string, isMan bool, arr ...int) { + +} + +func main() { + + foo("Tom", true, 1, 2, 3) + +} + +``` + +## 函数类型与函数变量 + +定义函数类型 +```go +// 示例:接收两个参数,返回一个参数 +type function_name func(int, int) int +``` + +示例 + +```go +package main + +import "fmt" + +// 定义函数类型 +type foo func(int, int) int + +func sum(a int, b int) int { + return a + b +} + +func max(a int, b int) int { + if a > b { + return a + } else { + return b + } +} + +func main() { + // 声明 + var f foo + + f = sum + s := f(1, 2) + fmt.Printf("%v\n", s) // 3 + + f = max + m := f(1, 2) + fmt.Printf("%v\n", m) // 2 + +} + +``` + +## 高阶函数 + +go语言的函数,可以作为函数的参数,也可以作为函数返回值 + +函数作为参数 + +```go +package main + +import "fmt" + +func sayHello(name string) { + fmt.Printf("Hello %s", name) +} + +func foo(name string, fun func(string)) { + fun(name) +} + +func main() { + + foo("Tom", sayHello) + // Hello Tom + +} + +``` + +函数作为返回值 +```go +package main + +import "fmt" + +func sum(a int, b int) int { + return a + b +} + +func sub(a int, b int) int { + return a - b +} + +func calc(name string) func(a int, b int) int { + switch name { + case "+": + return sum + case "-": + return sub + default: + return nil + } +} + +func main() { + sum := calc("+") + r := sum(1, 1) + fmt.Printf("%v", r) + // 2 +} + +``` + + diff --git a/blog/golang/golang-map.md b/blog/golang/golang-map.md new file mode 100644 index 0000000000000000000000000000000000000000..aa6f4fd8d03813fc4a3671a9767d5414c6cf1b01 --- /dev/null +++ b/blog/golang/golang-map.md @@ -0,0 +1,183 @@ +# 第十四章 Golang map + +`key:value` 键值对的数据结构容器 + +## 语法格式 + +```go +// 声明变量,默认是nil +var map_variable map[key_data_type]value_data_type + +// 使用make函数 +var map_variable = make(map[key_data_type]value_data_type) +``` + +示例 + +```go +package main + +import ( + "fmt" +) + +func main() { + // 声明 + var m map[string]string + + fmt.Printf("%v\n", m) + // map[] + + fmt.Printf("%T\n", m) + // map[string]string + + // 初始化 + m = make(map[string]string) + + m["name"] = "Steve" + + fmt.Printf("%v\n", m) + // map[name:Steve] + +} + +``` + +声明并初始化 + +```go +package main + +import ( + "fmt" +) + +func main() { + + // 声明并初始化 + m1 := make(map[string]string) + m1["name"] = "Tom" + m1["age"] = "12" + + fmt.Printf("%v\n", m1) + // map[age:12 name:Tom] + + // 声明并直接赋初始值 + m2 := map[string]string{ + "name": "Jack", + "age": "21", + } + + fmt.Printf("%v\n", m2) + // map[age:21 name:Jack] + +} + +``` + +## 访问数据 + +通过键key 获取值value + +```go +package main + +import ( + "fmt" +) + +func main() { + m := map[string]string{ + "name": "Jack", + "age": "21", + } + + // 访问成员 + name := m["name"] + + fmt.Printf("%v\n", name) + // Jack + +} + +``` + +## 成员检查 + +判断键是否存在 + +```go +value, ok = map[key] +``` + +示例 +```go +package main + +import ( + "fmt" +) + +func main() { + m := map[string]string{ + "name": "Jack", + "age": "21", + } + + // 访问成员 + name, ok := m["name"] + + fmt.Printf("%v\n", name) // Jack + fmt.Printf("%v\n", ok) // true +} + +``` + +## 遍历map + +示例1 + +```go +package main + +import ( + "fmt" +) + +func main() { + m := map[string]string{ + "name": "Jack", + "age": "21", + } + + for key, value := range m { + fmt.Printf("%v => %v\n", key, value) + } + // name => Jack + // age => 21 +} + +``` + +示例2 +```go +package main + +import ( + "fmt" +) + +func main() { + m := map[string]string{ + "name": "Jack", + "age": "21", + } + + for key := range m { + fmt.Printf("%v => %v\n", key, m[key]) + } + // name => Jack + // age => 21 +} + +``` diff --git a/blog/golang/index.md b/blog/golang/index.md index 6cbad53c449fe254c1bc079dc8e757f75f08067c..1ad49ba67671e6aeea78359ec274300796227057 100644 --- a/blog/golang/index.md +++ b/blog/golang/index.md @@ -12,7 +12,7 @@ [第二章 Golang 环境安装](blog/golang/golang-install.md) -[第三章 Golang 运行代码](blog/golang/golang-run.md) +[第三章 Golang 运行代码](/blog/golang/golang-run.md) [第四章 Golang 项目管理](blog/golang/golang-project.md) @@ -34,7 +34,12 @@ [第十三章 Golang 切片 slice](/blog/golang/golang-slice.md) +[第十四章 Golang map](/blog/golang/golang-map.md) + +[第十五章 Golang 函数](/blog/golang/golang-function.md) + https://www.bilibili.com/video/BV1ME411Y71o?p=27&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da -https://www.bilibili.com/video/BV1zR4y1t7Wj?p=35&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da \ No newline at end of file + +https://www.bilibili.com/video/BV1zR4y1t7Wj?p=42&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da \ No newline at end of file