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.当是值类型,它的方法只能是值接收者

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/18140.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论