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