“5c7a8aee07d432e68ca4d81a216b03019ccf12f9”上不存在“...git@gitcode.net:paddlepaddle/PaddleDetection.git”
提交 61d56f60 编写于 作者: 彭世瑜's avatar 彭世瑜

fix

上级 9c2db526
# 第十五章 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
}
```
# 第十四章 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
}
```
......@@ -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
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册