71 lines
1.5 KiB
Markdown
71 lines
1.5 KiB
Markdown
|
|
# 指针概念
|
|||
|
|
|
|||
|
|
|
|||
|
|
## 场景
|
|||
|
|
|
|||
|
|
+ func sum(a, b) total: 这种没有指针参与的
|
|||
|
|
+ func sum(a, b, sum): sum 是一个变量, 用于接收函数的处理结果
|
|||
|
|
+ fmt.Scan: 接收用户输入的参数
|
|||
|
|
+ flag.Parse(): 接收命令行参数
|
|||
|
|
+ Restful API Handler(req, *resp): resp 就是变量必须是指针,用于接收 请求处理后的结果
|
|||
|
|
|
|||
|
|
```go
|
|||
|
|
var i int
|
|||
|
|
fmt.Println("请输入一个整数:")
|
|||
|
|
fmt.Scan(&i) // 把输入写入 i
|
|||
|
|
|
|||
|
|
var port int
|
|||
|
|
flag.IntVar(&port, "port", 8080, "server port") // 命令行参数绑定到变量
|
|||
|
|
flag.Parse()
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
|
|||
|
|
## 概念
|
|||
|
|
|
|||
|
|
Go里面的参数 都是值传递, 不是引用传递(指针)
|
|||
|
|
|
|||
|
|
```go
|
|||
|
|
import (
|
|||
|
|
"fmt"
|
|||
|
|
"unsafe"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
func main() {
|
|||
|
|
a := 10
|
|||
|
|
b := 20
|
|||
|
|
c := sum(a, b)
|
|||
|
|
println("a + b =", c)
|
|||
|
|
|
|||
|
|
// 使用指针作为函数参数
|
|||
|
|
// 0x14000108020
|
|||
|
|
var result int
|
|||
|
|
|
|||
|
|
// &result (类型安全的指针) 东西叫指针 有类型约束,首GC印象的 地址
|
|||
|
|
fmt.Println("result 地址 =", &result)
|
|||
|
|
sumWithPointer(a, b, &result)
|
|||
|
|
println("a + b =", result)
|
|||
|
|
|
|||
|
|
// uintptr 是无类型指针,可以存放任意指针的地址值, 裸内存地址, 不安全指针, 可能随时被回事,成为一个无效地址
|
|||
|
|
// 非法使用 uintptr 导致程序崩溃
|
|||
|
|
fmt.Println("result 地址 uintptr =", uintptr(unsafe.Pointer(&result)))
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func sum(a int, b int) int {
|
|||
|
|
return a + b
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 这个函数没有Retrun
|
|||
|
|
// *int 就是指针类型, 传递是 int这种类型的变量的地址
|
|||
|
|
func sumWithPointer(a int, b int, c *int) {
|
|||
|
|
*c = a + b
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 获取用户输入
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
## 绑定CLI参数
|
|||
|
|
|