一架梯子,一头程序猿,仰望星空!
Golang初级特性面试题 > 内容正文

Go 引用类型与指针,有什么不同?


问题简答

Go指针类型也可以理解为是一种引用类型,都可以避免深拷贝,提高变量赋值效率,但是在使用上指针类型有专用的指针操作符,引用类型使用上跟普通变量类似。

问题详解:

引用类型:
指针,slice,map,chan,interface等都是引用类型 特点:变量存储的是一个地址,这个地址存储最终的值。内存通常在堆上分配,通过GC回收。

指针类型例子

package main

import "fmt"

func main() {
 name := "无尘"
 modify1(name)
 fmt.Println("name的值为:", name)
 modify2(&name)
 fmt.Println("name的值为:", name)
}

func modify1(name string) { //值类型
 name = "wucs"
} 
func modify2(name *string) { //指针类型
 *name = "wucs"
}
//运行结果:
//name的值为: 无尘
//name的值为: wucs

引用类型例子

下面以map为例

package main

import "fmt"

func main() {
 m:=make(map[string]int)
 m["无尘"] = 18
 fmt.Println("无尘的年龄为",m["无尘"])
 modify(m)
 fmt.Println("无尘的年龄为",m["无尘"])
}
func modify(p map[string]int)  {
 p["无尘"] =20
}
//运行结果:
//无尘的年龄为 18
//无尘的年龄为 20

说明:
通过上面例子,可以发现无论是指针类型还是引用类型,都可以,函数内部都可以修改函数外部变量的值,都可以高效传递参数,但是使用方式上有所差别,指针有专用的指针操作符,引用类型跟普通变量差不多。