Go 面试每天一篇(第 91 天)
原创
©著作权归作者所有:来自51CTO博客作者Seekload的原创作品,请联系作者获取转载授权,否则将追究法律责任
你好哇,欢迎来答题,一起来看下昨天题目的解析:
1.下面代码能通过编译吗?
1type T int
2
3func F(t T) {}
4
5func main() {
6 var q int
7 F(q)
8}
1type T int
2
3func F(t T) {}
4
5func main() {
6 var q int
7 F(q)
8}
2.下面代码能通过编译吗?请简要说明。
1type T []int
2
3func F(t T) {}
4
5func main() {
6 var q []int
7 F(q)
8}
1type T []int
2
3func F(t T) {}
4
5func main() {
6 var q []int
7 F(q)
8}
我们将这两道题目放到一块做一个解析,第一题不能通过编译,第二题可以通过编译。我们知道不同类型的值是不能相互赋值的,即使底层类型一样,所以第一题编译不通过;对于底层类型相同的变量可以相互赋值还有一个重要的条件,即至少有一个不是有名类型(named type)。
这是 Go 语言规范手册的原文:
"x's type V and T have identical underlying types and at least one of V or T is not a named type. "
Named Type 有两类:
- 内置类型,比如 int, int64, float, string, bool 等;
- 使用关键字 type 声明的类型;
Unnamed Type 是基于已有的 Named Type 组合一起的类型,例如:struct{}、[]string、interface{}、map[string]bool 等。
解析若有不妥之处,欢迎在留言区交流、指正!
看下今天的题目:
1.下面两段代码能否编译通过?请简要说明。
第一段:
1func f() {}
2func f() {}
3
4func main() {}
1func f() {}
2func f() {}
3
4func main() {}
第二段:
1func init(){}
2func init(){}
3
4func main() {}
1func init(){}
2func init(){}
3
4func main() {}
2.下面代码有什么问题?请指出。
1func (m map[string]string) Set(key string, value string) {
2 m[key] = value
3}
4
5func main() {
6 m := make(map[string]string)
7 m.Set("A", "One")
8}
1func (m map[string]string) Set(key string, value string) {
2 m[key] = value
3}
4
5func main() {
6 m := make(map[string]string)
7 m.Set("A", "One")
8}
答案以及解析会在下一篇文章中给出,鼓励大家在留言区留下答案,抱团学习,日拱一卒,每天进步一点!