开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第25天,点击查看活动详情
今天来学习下Go常见的习题问题(二),也是面试中可能会遇到的,让我们来一起学习吧~
习题
new与make
观察下面代码是否能通过编译,不能的话原因是啥?能的话,输出结果是什么?
func main() {
list := new([]int)
list = append(list, 1)
fmt.Println(list)
}
上面的代码不能通过编译,因为new([]int)之后的返回的是一个*[]int类型的指针,不能对指针进行append操作,可以使用make()初始化之后再进行append操作,同样对于map和channel类型建议使用make方式进行初始化
append()方法是是不能接收指针类型的变量
func append(slice []Type, elems ...Type) []Type
append()的用法
观察下面代码是否能通过编译,不能的话原因是啥?能的话,输出结果是什么?
func main() {
s1 := []int{1, 2, 3}
s2 := []int{7,8}
s1 = append(s1, s2)
fmt.Println(s1)
}
上述代码是不能通过编译的,因为append()的第二个参数不能直接使用slice,需要使用...操作符,意思是将一个切片追加到另一个切片上,正确写法是append(s1,s2...),或者直接在后面跟上所有元素,即append(s1,7,8)
变量申明
观察下面代码是否能通过编译,不能的话原因是啥?能的话,输出结果是什么?
var(
size := 2048
max_size = size*2
)
func main() {
fmt.Println(size,max_size)
}
上述代码不能通过编译,因为这里变量声明的简短模式,例如 size := 2048 这种模式是有以下三种限制:
- 必须使用显示初始化
- 不能提供数据类型,编译器会自动推导
- 只能在函数内部使用简短模式
指针变量访问成员变量
以下哪些方式可以访问结构体的成员变量
- A.p.name
- B.(&p).name
- C.(
*p).name - D.p->name
答案是选A和C, &是取地址符,*指针解引用,p.name会自动解析成(*p)的形式
类型定义和类型别名
观察下面代码是否能通过编译,不能的话原因是啥?能的话,输出结果是什么?
package main
import "fmt"
type MyInt1 int
type MyInt2 = int
func main() {
var i int = 2
var i1 MyInt1 = i
var i2 MyInt2 = i
fmt.Println(i1,i2)
}
不能通过编译,这里要区分类型别名和类型定义的区别
type MyInt1 int这行代码是基于int类型创建了一个新类型MyInt1
type MyInt2 = int这行代码则是创建了一个int的类型别名MyInt2,它本质还是int,只是换了个叫法,注意类型别名的定义是需要加=
所以var i1 MyInt1 = i 这行代码相当于将int类型的变量i赋值给一个MyInt1类型的i2,因为Go是强类型语言,所以编译是不能通过的, var i2 MyInt2 = i这行代码可以通过编译,因为MyInt2只是int的另一种叫法,本质上还是int所以是可以赋值的
总结
今天浅谈了Go的习题(二),主要介绍了GO面试中会出现的问题,接下来会继续分享其他的习题的相关知识,对于一个刚入门的我来说,还有许多地方需要学习,有错误的地方欢迎大家指出,共同进步!!