go基础语法-指针

Posted lz120792

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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部分

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

/*
改变指针指向的地址
第一次调用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基础语法-指针的主要内容,如果未能解决你的问题,请参考以下文章

[Go] 通过 17 个简短代码片段,切底弄懂 channel 基础

Go 语言笔试面试题(基础语法)

go基础语法-内置变量类型

go语言基本语法1

Go语言基础语法(一)

一文了解 Go 中的指针和结构体