golang学习之路-09指针

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指向的变量
}

 

你可能感兴趣的:(golang基础)