相关疑难解决方法(0)

用对象调用指针接收器的方法而不是指向它的指针?

v是指针的对象Vertex,并且Scale是指针的方法Vertex.那么为什么v.Scale(10)没有错,因为它v不是指向Vertex对象的指针?谢谢.

package main

import (
    "fmt"
    "math"
)

type Vertex struct {
    X, Y float64
}

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

func (v *Vertex) Scale(f float64) {
    v.X = v.X * f
    v.Y = v.Y * f
}

func main() {
    v := Vertex{3, 4}
    v.Scale(10)
    fmt.Println(v.Abs())
}
Run Code Online (Sandbox Code Playgroud)

methods pointers function call go

5
推荐指数
2
解决办法
191
查看次数

Go struct方法允许类型混合?

我有一个简单的结构,只有一个方法:

type Person struct {
  name string
}

func (p Person) SetName(name string) {
  p.name = name
}
Run Code Online (Sandbox Code Playgroud)

以下输出:

dave := Person{}
dave.SetName("Dave")
fmt.Println(dave.name)
Run Code Online (Sandbox Code Playgroud)

将是空的,因为方法接收器接受一个值(或更准确地创建您传递的值的副本),因此它不会修改您的基础值.

如果我将方法更改为:

func (p *Person) SetName(name string) {
  p.name = name
}
Run Code Online (Sandbox Code Playgroud)

输出将是"戴夫".

现在我不明白的是我不应该在指针上调用方法吗?所以在初始化我的对象时我应该这样做:

dave := &Person{}
Run Code Online (Sandbox Code Playgroud)

而不是这个:

dave := Person{}
Run Code Online (Sandbox Code Playgroud)

另外使用go的反射包我试图找出以下值:

&Person
Run Code Online (Sandbox Code Playgroud)

并发现它是*人,这很好.当我打印值虽然我没有得到内存位置相比,当我打印指向int的指针的值时:

a := 4
fmt.Println(&a)
Run Code Online (Sandbox Code Playgroud)

我一直在阅读文档,提出问题,但是我学的越多,我就越想知道我是否遗漏了一些简单的东西,因为很多人并不认为这一切都让人困惑.

go

0
推荐指数
1
解决办法
164
查看次数

标签 统计

go ×2

call ×1

function ×1

methods ×1

pointers ×1