码迷,mamicode.com
首页 > 其他好文 > 详细

go基础语法-指针

时间:2018-09-03 22:27:04      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:地址   ret   指针类型   spec   Golan   定义   基础   强制类型转换   不可用   

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部分

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

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

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

/*
不能改变指针本身
调用testPointer1后,b的值不会变
*/
var b = new(int)
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))
}

go基础语法-指针

标签:地址   ret   指针类型   spec   Golan   定义   基础   强制类型转换   不可用   

原文地址:https://www.cnblogs.com/lz120792/p/9581223.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!