本教材由知了传课辛苦制作而成,仅供学习使用,请勿用于商业用途!如进行转载请务必注明出处!谢谢!

面试题

一、选择题

1.关于接口,下面说法正确的是()

A. 只要两个接口拥有相同的方法列表(次序不同不要紧),那么它们就是等价的,可以相互赋值
B. 如果接口A的方法列表是接口B的方法列表的子集,那么接口B可以赋值给接口A
C. 接口查询是否成功,要在运行期才能够确定
D. 接口赋值是否可行,要在运行期才能够确定

参考答案:ABC

A.实质上同一个接口
B.A是B的子集,意味着A的方法B中都有,那么A是B的基类,所以A=B是可行的
c.接口查询实则是类型断言判断, val, ok := interfaceName.(TypeName)
D.接口赋值是否可行在编译阶段就可以知道

2.关于类型转化,下面语法正确的是()

type MyInt int var mi MyInt var i int = 1 A.mi = i B.mi = (MyInt)i C.mi = MyInt(i) D.mi = i.(MyInt) 参考答案:C 强制类型转化

3.关于接口和类的说法,下面说法正确的是

A. 一个类只需要实现了接口要求的所有函数,我们就说这个类实现了该接口
B. 实现类的时候,只需要关心自己应该提供哪些方法,不用再纠结接口拆的多细才合理
C. 类实现接口时,需要导入接口所在的包
D. 接口由使用方按自身需求来定义

答案:ABD

4.interface{}是可以指向任意对象的类型()

A.是
B.否

答案:A

二、简答题

1.go的接口是什么?

在go语言中,interface也就是接口,被用来指定一个对象。接口具有下面的要素:

一系列的方法。

具体应用中用来表示某个数据类型。

在go中使用interface来实现多态。

2.请说出下面代码存在什么问题?

type Person struct { Name string } func f(v interface{}) { man := v.(Type) switch v{ case Person{}: man.Name = "hallen" } } 有错误,man := v.(Type)这里应该转为Person类型 正确代码如下: type Person struct { Name string } func f(v interface{}) { man := Person{} switch v{ case Person{}: man.Name = "hallen" } }

3.下面代码语法有误吗?

func Test(x *interface{}) { } 有错, 函数参数为 interface{} 时可以接收任何类型的参数,接收指针类型也用 interface{},不用 *interface{}

4.对于下面的代码,写出执行结果

func main() {
a := interface{}(nil) // 类型是<nil>
b := (*int)(nil) // 类型是*int
_, c := a.(interface{}) // 断言,不成功则为false,成功则为true

}

A.fmt.Println(a == b) // false
B.fmt.Println(b == nil) // true
C.fmt.Println(c) // false

5.2 个 interface类型 可以比较吗 ?

package main

import "fmt"

func main() {
var i1 interface{}
var i2 interface{}

if i1 == i2 {
fmt.Println("相等")
}
}

6.指针类型怎么转换?

var a int = 10
var p *int =&a
var c *int64
c= (*int64)(p)

7.写一个多态的示例

1444人已阅读,今天你学习了吗?

添加新回复