NoPerfectName Engineer

自定义类型方法,pointers vs values

2018-12-20
NoPerfectName

Pointers vs Values

  • 内置类型和引用类型不能直接使用类型方法,只能通过自定义类型才能使用自定义方法

    type I int
    func (i I) f() {
          
    }
    
  • 虽然值方法和指针方法都可以被值变量和指针变量调用,但是官方文档规定一条rule

    The rule about pointers vs. values for receivers is that value methods can be invoked on pointers and values, but pointer methods can only be invoked on pointers.

  • receiver是指针还是值,取决于自定义类型的底层数据,如果不希望底层数据被修改,则使用值,否则使用指针

    type B struct {
    	s []int
    	c rune
    }
      
    func (b B) test() {
    	b.s[0] = 20
    	b.c = 'H'
    }
      
    func (b *B) test1() {
    	b.s[0] = 30
    	b.c = 'K'
    }
      
    func main() {
    	b := B{
    		s:[]int{1,2,3},
    		c:'h',
    	}
    	b.test()
    	fmt.Println(b.s)
    	fmt.Println(string(b.c))
        //[20 2 3]
    	//h
    	b.test1()
    	fmt.Println(b.s)
    	fmt.Println(string(b.c))
    	//[30 2 3]
    	//K
    }
    

    从上例可以看到,当receiver是值时,引用类型虽然是拷贝的即传值,但是实际是共享底层数据的,所以调用传值方法时,底层数据的修改会影响变量。


Similar Posts

上一篇 自定义类型

下一篇 传结构体参数

Comments