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())
    }
    
  • 相关阅读:
    Ⅲ:作业
    Ⅱ:python入门
    Auth模块
    django中间件
    Django的cookie以及session
    form组件
    Django Ajax
    Django模板层3和ajax初始
    聚合/分组 查询 事务
    Django ORM常用模块
  • 原文地址:https://www.cnblogs.com/chusiyong/p/14439689.html
Copyright © 2011-2022 走看看