不同类型指针之间的区别是什么?

时间:2016-11-13 16:03:13

标签: pointers go

指针引用内存中的某个位置。实际上,据我所知,所有内存地址都具有独立于变量类型的相同类型。

对于所有指针类型,只使用一种类型(*int),而不是使用不同的指针类型(*stringvar p pointer等...)。

不同指针类型之间有什么区别?

package main

import "fmt"

func main() {
    i := 5
    s := "abc"

    var pi *int      // alternatively var pi pointer
    var ps *string   // alternatively var ps pointer 

    pi = &i
    ps = &s

    fmt.Printf("%p %p", pi, ps)  // result is 0x1040e0f8 0x1040a120
}

2 个答案:

答案 0 :(得分:2)

Go中的类型系统旨在防止与指针相关的内存错误。这允许程序员有足够的控制来操纵内存中的对象,同时允许垃圾收集器顶部警察喜怒无常。 如果需要手动存储和转换指针类型,可以使用unsafe package

答案 1 :(得分:1)

  

这对于所有指针类型只使用一种类型吗?

是的,这几乎就是C的工作原理。不幸的是,这使语言变得危险。假设你有一个10字节的数组。如果您只是传递指针,其他代码将不知道可以安全访问多少字节。这会导致各种缓冲区溢出错误。 (即HeartBleed)

在Go中,它们指针知道它指向的东西的类型,因此它可以防止代码一直出现缓冲区溢出问题。

您可以执行您想要的操作,但只能使用不安全的软件包。顾名思义,这是一件非常危险的事情。

也许如果你发布你实际上想要做的事情,人们可以帮助你。使用不安全的指针并不是编写高性能代码的唯一方法。