zoukankan      html  css  js  c++  java
  • 难理解的点---值方法和指针方法 + 接口赋值

    值方法和指针方法

    值对象可以调用值方法&指针方法

    type Person struct{
    	Name string 
    	Age int 
    }
    
    // 值方法
    func(p Person) SayHello(){
    	fmt.Printf("Hello, my name is %s
    ", p.Name)
    }
    // 引用方法
    func(p *Person) SetAge(age int){
    	p.Age = age
    }
    
    func main(){
    	var jack = Person{"jack", 10}
    	jack.SayHello()
    	jack.SetAge(20)
    	fmt.Println(jack.Age)  // 20
    }

    很明显,值类型肯定可以调用值方法,而对于指针方法的调用,其实是golang的语法糖,调用的时候jack.SetAge,会自动转换成(&jack).SetAge

    指针对象可以调用值方法&指针方法

    type Person struct{
    	Name string 
    	Age int 
    }
    // 值方法
    func(p Person) SayHello(){
    	fmt.Printf("Hello, my name is %s
    ", p.Name)
    }
    // 引用方法
    func(p *Person) SetAge(age int){
    	p.Age = age
    }
    
    func main(){
    	var jack = &Person{"jack", 10}
    	jack.SayHello()
    	jack.SetAge(20)
    	fmt.Println(jack.Age)  // 20
    }
    

    指针对象调用值方法也是golang中的语法糖,在调用值方法jack.SayHello的时候,会自动转换成(*jack).SayHello

    接口赋值

    如果我们调用一个接口里面的函数,结构体对象实现接口时的方法可能是指针方法也可以是值方法,那么需要注意:

    • 值类型只能调用值方法

    • 指针类型可以调用值方法和指针方法

    • 不确定怎么赋值就用指针类型赋值
    package main 
    
    import (
    	"fmt"
    )
    
    // 接口类型
    type Human interface{
    	SayHello()
    	SetAge(age int)
    	GetAge()int 
    }
    
    // 结构体对象
    type Person struct{
    	Name string 
    	Age int 
    }
    
    // 值方法
    func(p Person) SayHello(){
    	fmt.Printf("Hello, my name is %s
    ", p.Name)
    }
    
    // 指针方法
    func(p *Person) SetAge(age int){
    	p.Age = age
    }
    
    // 值方法
    func(p Person)GetAge()int{
    	return p.Age
    }
    
    func main(){
    	// jack是个接口,被一个指针对象赋值,下面的方法都可以正确执行
    	var jack Human  
    	jack = &Person{"jack", 10} 
    	jack.SayHello() 
    	jack.SetAge(20)
    	fmt.Println(jack.GetAge())
    
    	// 值类型并没有实现SetAge的方法,所以赋值的时候会报错
    	var Tom Human 
    	Tom = Person{"Tom", 12}
    	Tom.SayHello()
    	Tom.SetAge(10)
    	fmt.Println(Tom.GetAge())
    }
    
  • 相关阅读:
    在命令行下运行Matlab
    VMWare无法共享文件夹(Win7宿主机Ubuntu14.04客户机)
    [转] CVonline: Image Databases
    第二天
    第一天
    二宝软件的NABCD分析
    用c++实现环形数组的最大子数组之和
    返回一个二维整数数组中最大子数组的和
    求最大子数组之和
    四则运算
  • 原文地址:https://www.cnblogs.com/chusiyong/p/14439689.html
Copyright © 2011-2022 走看看