• Go_笔试题记录-指针与值类型实现接口的区别


    1、如果Add函数的调用代码为:

    func main() {
            var a Integer = 1
            var b Integer = 2
            var i interface{} = &a
            sum := i.(*Integer).Add(b)
            fmt.Println(sum)
    }
    

    则Add函数定义正确的是()

    A.
    
    type Integer int
    func (a Integer) Add(b Integer) Integer {
            return a + b
    }
    
    B.
    type Integer int
    func (a Integer) Add(b *Integer) Integer {
            return a + *b
    }
    
    C.
    type Integer int
    func (a *Integer) Add(b Integer) Integer {
            return *a + b
    }
    
    D.
    type Integer int
    func (a *Integer) Add(b *Integer) Integer {
            return *a + *b
    }
    

    参考答案:AC

    2、如果Add函数的调用代码为:

    func main() {
            var a Integer = 1
            var b Integer = 2
            var i interface{} = a
            sum := i.(Integer).Add(b)
            fmt.Println(sum)
    }
    

    则Add函数定义正确的是()

    A.
    
    type Integer int
    func (a Integer) Add(b Integer) Integer {
            return a + b
    }
    
    B.
    type Integer int
    func (a Integer) Add(b *Integer) Integer {
            return a + *b
    }
    
    C.
    type Integer int
    func (a *Integer) Add(b Integer) Integer {
            return *a + b
    }
    
    D.
    type Integer int
    func (a *Integer) Add(b *Integer) Integer {
            return *a + *b
    }
    

    参考答案:A

    3、关于GetPodAction定义,下面赋值正确的是()

    type Fragment interface {
            Exec(transInfo *TransInfo) error
    }
    type GetPodAction struct {
    }
    func (g GetPodAction) Exec(transInfo *TransInfo) error {
            ...
            return nil
    }
    
    A. var fragment Fragment = new(GetPodAction)
    B. var fragment Fragment = GetPodAction
    C. var fragment Fragment = &GetPodAction{}
    D. var fragment Fragment = GetPodAction{}
    

    参考答案:ACD

    考察知识点

    指针与值类型实现接口的区别

    package main
    
    import (
    	"fmt"
    )
    
    type People interface {
    	ReturnName() string
    }
    
    type Student struct {
    	Name string
    }
    
    type Teacher struct {
    	Name string
    }
    
    func (s Student) ReturnName() string {
    	return s.Name
    }
    
    func (t *Teacher) ReturnName() string {
    	return t.Name
    }
    
    func main() {
    	cbs := Student{Name: "咖啡色的羊驼"}
    	sss := Teacher{Name: "咖啡色的羊驼的老师"}
    
    	// 值类型
    	var a People
    	a = cbs
    	name := a.ReturnName()
    	fmt.Println(name)
    
    	// 指针类型
    	//a = sss // <- 这样写不行!!!
    	a = &sss // 由于是指针类型,所以赋值的时候需要加上&
    	name = a.ReturnName()
    	fmt.Println(name) // 输出"咖啡色的羊驼的老师"
    }
    
    

    “a = sss”这样写会发生报错:

    cannot use sss (type Teacher) as type People in assignment:
    Teacher does not implement People (ReturnName method has pointer receiver)
    

    因为是Teacher的指针实现了ReturnName方法,Teacher本身没实现。

    总结:

    1.当是指针类型,它的方法可以是指针接收者,或者是值接收者
    2.当是值类型,它的方法只能是值接收者

  • 相关阅读:
    Win7双击任务栏图标导致窗口还原的问题
    一致性哈希算法及其在分布式系统中的应用(转)
    CAP理论(转)
    从Android界面开发谈起(转)
    Android开发入门之Window 环境概念介绍(转)
    数据库缓存技术(转)
    VoltDB开篇 简介(转)
    window下如何让php支持openssl(转)
    mysql分表的3种方法(转)
    linux crontab 每10秒执行一次
  • 原文地址:https://www.cnblogs.com/Paul-watermelon/p/11209603.html
Copyright © 2020-2023  润新知