当前位置: 首页 > 面试题库 >

Golang指针

凌嘉志
2023-03-14
问题内容

我目前正在学习使用Go语言编程。我在理解Go指针时遇到了一些困难(并且我的C / C
++现在很遥远…)。例如,在“第52号游览”中(http://tour.golang.org/#52),我读到:

type Vertex struct {
    X, Y float64
}

func (v *Vertex) Abs() float64 {
    return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

func main() {
    v := &Vertex{3, 4}
    fmt.Println(v.Abs())
}

但是如果不是

func (v *Vertex) Abs() float64 {
[...]
v := &Vertex{3, 4}

我写:

func (v Vertex) Abs() float64 {
[...]
v := Vertex{3, 4}

甚至:

func (v Vertex) Abs() float64 {
[...]
v := &Vertex{3, 4}

反之亦然:

func (v *Vertex) Abs() float64 {
[...]
v := Vertex{3, 4}

我得到了完全相同的结果。有区别吗(在内存方面,等等)?


问题答案:

您的示例使用两种Go语言规则:

  1. 可以从具有值接收器的方法派生具有指针接收器的方法。这样func (v Vertex) Abs() float64将自动生成一个附加的方法实现:
    func (v Vertex) Abs() float64 { return math.Sqrt(v.X*v.X+v.Y*v.Y) }
    

    func (v Vertex) Abs() float64 { return Vertex.Abs(v) } // GENERATED METHOD

编译器将自动找到生成的方法:

    v := &Vertex{3, 4}
v.Abs()  // calls the generated method
  1. Go可以自动获取变量的地址。在以下示例中:
        func (v *Vertex) Abs() float64 { return math.Sqrt(v.X*v.X+v.Y*v.Y) }
    func main() {
        v := Vertex{3, 4}
        v.Abs()
    }

该表达式v.Abs()等效于以下代码:

    vp := &v
vp.Abs()


 类似资料:
  • 与普通指针并无差异 package main import "fmt" func main() { var dict map[string]string = map[string]string{"name":"lnj", "age":"33"} var p *map[string]string = &dict (*p)["name"] = "zs" fmt.Println(di

  • 在 C 语言中,数组名,&数组名,&数组首元素保存的都是同一个地址 #include <stdio.h> int main(){ int arr[3] = {1, 3, 5}; printf("%p\n", arr); // 0060FEA4 printf("%p\n", &arr); // 0060FEA4 printf("%p\n", &a

  • 和 C 语言一样,允许用一个变量来存放其它变量的地址,这种专门用于存储其它变量地址的变量,我们称之为指针变量 和 C 语言一样,Go 语言中的指针无论是什么类型占用内存都一样(32位4个字节,64位8个字节) package main import ( "fmt" "unsafe" ) func main() { var p1 *int; var p2 *floa

  • Go 语言中指向结构体的指针和 C 语言一样 结构体和指针 创建结构体指针变量有两种方式 package main import "fmt" type Student struct { name string age int } func main() { // 创建时利用取地址符号获取结构体变量地址 var p1 = &Student{"lnj", 33}

  • 值得注意点的是切片的本质就是一个指针指向数组,所以指向切片的指针是一个二级指针 package main import "fmt" func main() { // 1.定义一个切片 var sce[]int = []int{1, 3, 5} // 2.打印切片的地址 // 切片变量中保存的地址, 也就是指向的那个数组的地址 sce = 0xc0420620a0 f

  • 问题内容: 好的,我有一个主包和一个http处理程序包。本质上,我想做的是设置一个全局结构,以便我可以随时调用该结构中的信息。 下面是我尝试的示例的基本概述:主程序包导入处理程序函数主程序包调用handlerfunc Handlerfunc将http.ResponseWriter和其他项设置为UrlInfo结构Handlerfunc在函数中传递(不必将UrlStruct传递到函数中)Run函数(在