面试题
一、选择题
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.写一个多态的示例