这两个的区别

type Required struct {
}

func (v Required) CleanData(value string) (bool, string) {

}

与:

type Required struct {
}

func (v *Required) CleanData(value string) (bool, string) {

}

共 5 个回复


jxqstu

有, 第一个方法传的是值拷贝, 第二个方法传的地址。若你再方法里修改Required对象里的成员值的话, 第一个方法 Required对象里的成员值不改变, 第二个方法Required对象里的成员值则会被修改。

# 0

jiang11958

谢谢@jxqstu,是不是这两种里面 CleanData方法都是属于Required 的?

还有就是这两种方式分别用在什么情况呢?

谢谢

# 1

jimmykuu

The Way to Go中的一段代码:

package main
import (
       “fmt”
)
type List []int
func (l List) Len() int { return len(l) }
func (l *List) Append(val int) { *l = append(*l, val) }
func main() {
    // A bare value
    var lst List
    lst.Append(1)
    fmt.Printf("%v (len: %d)\n", lst, lst.Len()) // [1] (len: 1)
    // A pointer value
    plst := new(List)
    plst.Append(2)
    fmt.Printf("%v (len: %d)\n", plst, lst.Len()) // &[2] (len: 1)
}

如果需要修改通过方法修改自己,那么必须传递指针,如果不需要修改自己,传值就可以。

另外,传递指针效率更高,开销小,如果是小的变量,区别不大,因为传值有个拷贝的过程,所以从性能上考虑,有时候传递需要传递指针。 

# 2

jiang11958

多谢各位,@jimmykuu 的例子一针见血啊

# 4