zoukankan      html  css  js  c++  java
  • 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.当是值类型,它的方法只能是值接收者

  • 相关阅读:
    http statusCode(状态码) 200、300、400、500序列
    一行css代码调试中学到的javascript知识,很有意思
    jquery中的cookie
    图片预加载和AJAX的图片预加载
    关于图片懒加载
    iframe的自适应
    阻止微信端浏览器下滑出现空白条现象
    动态加载js文件
    kaldi 的安装和测试
    Python算法-排序
  • 原文地址:https://www.cnblogs.com/Paul-watermelon/p/11209603.html
Copyright © 2011-2022 走看看