go基础语法-指针

1.基础定义

golang的指针没有cpp等语言的指针复杂,具体表现在其不可用于运算、只有值传递

语法:var variableName *int = memoryAddr

var a = 2
var p *int = &a
p = p + 1 //编译器会报错:invalid operation : ...

2.指针类型转换

golang中不同类型的指针间不能相互转换,例:*int、*int32、*int64

m1,m2,m3 := int(1),int32(1),int64(1)
p := &m1
p32 := &m2
p64 := &m3
//下面的强制类型转换编译器会报错,使用某些IDE编码时会直接提示类型转换错误
p = (*int)(p32)
p = (*int)(p64)
p32 = (*int32)(p)
p32 = (*int32)(p64)
p64 = (*int64)(p)
p64 = (*int64)(p32)

3.只有值传递?

golang的函数调用中没有引用传递的说法,只有值传递!在一些书籍或网上博客中讲解golang指针和函数调用时存在错误。具体规范参见The Go Programming Language Specification中的Calls部分

传指针可以实现类似传引用的效果,传指针可以改变指针指向的地址

/*
改变指针指向的地址
调用func testPointer后,a的值变为2
*/
var a int = 1
testPointer(&a)
func testPointer(p *int){
  *p = 2
}

只有值传递,指针本身的值是不能改变的

/*
不能改变指针本身
调用func testPointer1后,b的值不会变
*/
var b = new(int)
testPointer1(b)
func testPointer1(p *int)  {
	p = nil
}

测试代码

package main
import "fmt"
/*
改变指针指向的地址
 */
func testPointer(p *int)  {
		*p =2
}
/*
不能改变指针本身
 */
func testPointer1(p *int)  {
	p = nil
}
/*
交换变量值
 */
func swapValue1(a,b *int)  {
	*a,*b = *b,*a
}
func swapValue(a,b int)(int ,int)  {
	return b,a
}
func main() {
	var a = 0
	b := new(int)
	testPointer(&a)
	fmt.Println(a)
	fmt.Println(b)
	testPointer1(b)
	fmt.Println(b)
	m,n := 1,2
	swapValue1(&m,&n)
	fmt.Println(m,n)
	fmt.Println(swapValue(m,n))
}
posted @ 2018-09-03 21:59  遥望1992  阅读(929)  评论(0编辑  收藏  举报