package main
import (
"flag"
"fmt"
)
/*
Go允许你控制特定集合的数据结构、分配的数量以及内存访问模式
这对于构建良好的系统是非常重要的,指针对于性能的影响不言而喻
系统编程、操作系统、网络应用,指针是不可或缺的一部分。
指针:pointer
1、类型指针
允许这个指针类型的数据进行修改,传递参数可以直接使用指针,
无需拷贝数据,类型指针不能进行偏移和运算。
2、切片
由指向起始元素的元素指针、元素数量和容量组成
好处:
受益于这样的约束、拆分,Go的指针类型变量即拥有高效访问的特点
又不会发生指针偏移,从而避免了非法修改关键性数据的问题。
同时垃圾回收也比较容易对不易发生偏移的指针进行检索和回收。
对比:
切片比原始指针具备更强大的特性,而且更为安全。
切片在发生越界时,运行会报出宕机,并且打出堆栈,
原指针只会崩溃
1、指针变量通常缩写为ptr pointer,默认值nil
2、变量在运行时有一个地址,这个地址代表变量在内存中的位置。
使用&操作符获取变量内存地址(取地址操作)。
//使用指针变量获取命令行的输入信息
//flag backeg :实现对命令行参数的解析
//使得开发命令行工具变得更为简单
*/
var mode = flag.String("mode","","process mode")
func main() {
//ptr:=&v//V的类型为T,ptr的类型为*T,称作T的指针类型,*代表指针
var cat int = 1
var str string= "Cold"
fmt.Printf("%p %p",&cat,&str)
//从指针获取实际指向的值
//准备字符串
var house = "Music point 100800,90265"
//对字符串取地址,ptr类型为*string
ptr:=&house
//打印ptr类型
fmt.Printf("ptr type:%T\n",ptr)
//打印ptr对指针地址
fmt.Printf("address:%p\n",ptr)
//str :=new(string)
//*str = "Go语言教程"
//fmt.Println(*str)
//对指针进行取值
value :=*ptr
//取值后的类型
fmt.Printf("value type:%T\n",value)
//指针取值后指向变量的值
fmt.Printf("value:%s\n",value)
//解析命令行参数
flag.Parse()
//输出命令行参数
fmt.Println(*mode)
//go run main.go --mode=fast
x,y:=1,2
swap(&x,&y)//实参传递,传递地址
println(x,y)
}
//交换函数
func swap(a,b *int) { //接收地址
//取a指针的值,赋值给临时变量t
t := *a //*a指向的变量的值赋值给t
*a = *b //b指向的变量的值赋值给a指向的变量
*b = t //t的值赋值给b指向的变量
}