package main import ( "flag" "fmt" ) func main() { //指针 var cat int = 1 var str string = "ba" fmt.Printf("%p %p\n", &cat, &str) // 变量 指针和地址三者关系 每个变量都拥有地址 指针的值就算地址 //当使用 &操作符对普通变量进行取地址操作并得到变量的指针后可以对指针使用 *操作符也就是指针取值 // 准备一个字符串 var house = "my name is 111" //对字符串进行取地址 ptr := &house //打印出 ptr类型 fmt.Printf("type %T\n", ptr) //打印出 ptr指针地址 fmt.Printf("addr %p\n", ptr) //对指针进行取值操作 value := *ptr // 取值后的类型 fmt.Printf("value type: %T\n", value) // 指针取值后就是指向变量的值 fmt.Printf("value: %s\n", value) //取地址操作符&和取值操作符*是一对互补操作符,&取出地址,*根据地址取出地址指向的值。 //使用指针修改值 x, y := 1, 2 swap(&x, &y) //输出 fmt.Println(x, y) //定义命令行参数 var mode = flag.String("mode", "", "process mode") //解析命令参数 flag.Parse() // 输出命令行参数 fmt.Println(*mode) //创建指针的另一种方法——new() 函数 str_1 := new(string) *str_1 = "Go语言教程" fmt.Println(*str_1) } //交换函数 func swap(a, b *int) { // 取a指针的值, 赋给临时变量t t := *a // 取b指针的值, 赋给a指针指向的变量 *a = *b // 将a指针的值赋给b指针指向的变量 *b = t } /* 第 6 行,定义一个交换函数,参数为 a、b,类型都为 *int 指针类型。 第 9 行,取指针 a 的值,并把值赋给变量 t,t 此时是 int 类型。 第 12 行,取 b 的指针值,赋给指针 a 指向的变量。注意,此时*a的意思不是取 a 指针的值,而是“a 指向的变量”。 第 15 行,将 t 的值赋给指针 b 指向的变量。 第 21 行,准备 x、y 两个变量,分别赋值为 1 和 2,类型为 int。 第 24 行,取出 x 和 y 的地址作为参数传给 swap() 函数进行调用。 第 27 行,交换完毕时,输出 x 和 y 的值。 *操作符作为右值时,意义是取指针的值,作为左值时,也就是放在赋值操作符的左边时,表示 a 指针指向的变量。 其实归纳起来,*操作符的根本意义就是操作指针指向的变量。当操作在右值时,就是取指向变量的值,当操作在左值时,就是将值设置给指向的变量 */