# 指针概念


## 场景

+ 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里面的参数 都是值传递, 不是引用传递(指针)

![alt text](image.png)

```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
}
```

## 获取用户输入

```go
// 获取用户输入
var i int
fmt.Println("请输入一个整数：")
fmt.Scan(&i) // 把输入写入 i
fmt.Println("你输入的整数是：", i)
```

## 绑定CLI参数

```go
// 命令行参数解析
// --port 9090
var port int
flag.IntVar(&port, "port", 8080, "server port") // 命令行参数绑定到变量
flag.Parse()
fmt.Println("服务器端口号是：", port)
```
