开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 17 天,点击查看活动详情
今天来学习下Go常见的习题问题(二十七),也是面试中可能会遇到的,让我们来一起学习吧~
copy函数
观察下列代码,判断输出结果是什么?为什么?
func main() {
var src, dst []int
src = []int{1, 2, 3}
copy(dst, src)
fmt.Println(dst)
}
参考答案:输出结果为[],copy(dst, src) 函数是根据len(dst)、len(src) 两者之间最小的值进行拷贝操作,此时dst的大小为nil,所以想要完全拷贝,需要给dst分配足够的内存空间才行
NamedType 与 UnNamedType
观察下列代码,判断两者是否可以通过编译?为什么?
type T int
func F(t T) {}
func main() {
var q int
F(q)
}
type T []string
func F(t T) {}
func main() {
var q []string
F(q)
}
参考答案:第一个不能通过编译,第二个可以通过,不同类型的值是不能直接赋值的,即便底层类型都是int,所以第一个不能通过编译,第二个底层类型相同,可以直接赋值的原因是要存在一个不是有名类型(named type),规则如下:
-
Named types are types with a name, such as int, int64, float, string, bool. In addition, any type you create using ‘type’ is a named type.
-
Unnamed types are those such as []string, map[string]string, [4]int. They have no name, simply a description corresponding to how they are to be structured.
Unnamed Type 是基于已有的 Named Type 组合一起的类型
init()函数
观察下列代码,判断编译是否通过?
func f1() {}
func f1() {}
func main() {}
func init(){}
func init(){}
func main() {}
参考答案:第一段代码不能通过编译,第二段代码可以通过编译,因为在一个包内,只能是init()函数可以存在同名的,其余的只能存在一个
总结
今天浅谈了Go的习题(二十七),主要介绍了GO面试中会出现的问题,接下来会继续分享其他的习题的相关知识,对于一个刚入门的我来说,还有许多地方需要学习,有错误的地方欢迎大家指出,共同进步!!