golang有指针。Go语言为程序员提供了控制数据结构指针的能力,其对指针的支持介于Java语言和C/C++语言之间,它既没有像Java那样取消了代码对指针的直接操作的能力,也避免了C/C++中由于对指针的滥用而造成的安全和可靠性问题。指针在Go语言中可被拆分为两个核心概念:1、类型指针,允许对这个指针类型的数据进行修改;2、切片,由指向起始元素的原始指针、元素数量和容量组成。
本教程操作环境:windows7系统、GO 1.18版本、Dell G3电脑。
与 Java 和 .NET 等编程语言不同,Go语言为程序员提供了控制数据结构指针的能力,但是,并不能进行指针运算。Go语言允许你控制特定集合的数据结构、分配的数量以及内存访问模式,这对于构建运行良好的系统是非常重要的。指针对于性能的影响不言而喻,如果你想要做系统编程、操作系统或者网络应用,指针更是不可或缺的一部分。
Go语言对指针的支持介于Java语言和C/C++语言之间,它既没有像Java那样取消了代码对指针的直接操作的能力,也避免了C/C++中由于对指针的滥用而造成的安全和可靠性问题。
指针(pointer)在Go语言中可以被拆分为两个核心概念:
类型指针,允许对这个指针类型的数据进行修改,传递数据可以直接使用指针,而无须拷贝数据,类型指针不能进行偏移和运算。
切片,由指向起始元素的原始指针、元素数量和容量组成。
受益于这样的约束和拆分,Go语言的指针类型变量即拥有指针高效访问的特点,又不会发生指针偏移,从而避免了非法修改关键性数据的问题。同时,垃圾回收也比较容易对不会发生偏移的指针进行检索和回收。
切片比原始指针具备更强大的特性,而且更为安全。切片在发生越界时,运行时会报出宕机,并打出堆栈,而原始指针只会崩溃。
golang中什么是指针?
指针是一个变量,其值是另一个变量的地址,即存储器位置的直接地址。类似变量或常量一样,必须要先声明一个指针,然后才能使用它来存储任何变量地址。指针变量声明的一般形式是:
var var-name *var-type
这里,var-type是指针的基类型; 它必须是有效的Go数据类型,var-name是指针变量的名称。用于声明指针的星号(*)与用于乘法的星号相同。但是,在此语句中,星号(*)用于将变量指定为指针。以下是有效的指针声明:
var ip *int /* pointer to an integer */ var fp *float32 /* pointer to a float */
所有指针的值的实际数据类型(无论是整数,浮点数还是其他数据类型)都是相同的,它表示内存地址的长十六进制数。不同数据类型的指针的唯一区别是指针所指向的是变量或常量的数据类型。【相关推荐:Go视频教程】
如何使用指针?
有几个重要的操作,将非常频繁地使用指针来实现。
定义一个指针变量
将一个变量的地址赋值给一个指针
最后访问指针变量中可用地址的值
这是通过使用一元运算符*
来返回位于操作数指定的地址的变量的值。下面的例子使用这些操作:
package main import "fmt" func main() { var a int= 20 /* actual variable declaration */ var ip *int /* pointer variable declaration */ ip = &a /* store address of a in pointer variable*/ fmt.Printf("Address of a variable: %x\n", &a ) /* address stored in pointer variable */ fmt.Printf("Address stored in ip variable: %x\n", ip ) /* access the value using the pointer */ fmt.Printf("Value of *ip variable: %d\n", *ip ) }
当上面的代码编译和执行时,它产生结果如下:
Address of var variable: 10328000 Address stored in ip variable: 10328000 Value of *ip variable: 20
在Go语言中的nil指针
Go编译器为指针变量分配一个Nil
值,以防指针没有确切的地址分配。这是在变量声明的时候完成的。指定为nil
值的指针称为nil指针。
nil
指针是在几个标准库中定义的值为零的常量。参考下面的程序:
package main import "fmt" func main() { var ptr *int fmt.Printf("The value of ptr is : %x\n", ptr ) }
当上面的代码编译和执行时,它产生结果如下:
The value of ptr is 0
在大多数操作系统上,程序不允许访问地址0
处的内存,因为该内存是由操作系统保留的。 然而,存储器地址0
具有特殊意义;它表示指针不打算指向可访问的存储器位置。但是按照惯例,如果指针包含nil
(零)值,则假设它不指向任何东西。
要检查是否为nil
指针,可以使用if
语句,如下所示:
if(ptr != nil) /* succeeds if p is not nil */ if(ptr == nil) /* succeeds if p is null */
更多编程相关知识,请访问:编程视频!!
以上是golang有指针么的详细内容。更多信息请关注PHP中文网其他相关文章!