# 指针概念 ## 场景 + 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) ```