浅谈Go与习题(二)

115 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第25天,点击查看活动详情

今天来学习下Go常见的习题问题(二),也是面试中可能会遇到的,让我们来一起学习吧~

习题

new与make

观察下面代码是否能通过编译,不能的话原因是啥?能的话,输出结果是什么?

func main() {
    list := new([]int)
    list = append(list, 1)
    fmt.Println(list)
}

上面的代码不能通过编译,因为new([]int)之后的返回的是一个*[]int类型的指针,不能对指针进行append操作,可以使用make()初始化之后再进行append操作,同样对于mapchannel类型建议使用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 这种模式是有以下三种限制:

  1. 必须使用显示初始化
  2. 不能提供数据类型,编译器会自动推导
  3. 只能在函数内部使用简短模式

指针变量访问成员变量

以下哪些方式可以访问结构体的成员变量

  • 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)
}

不能通过编译,这里要区分类型别名类型定义的区别

image.png

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面试中会出现的问题,接下来会继续分享其他的习题的相关知识,对于一个刚入门的我来说,还有许多地方需要学习,有错误的地方欢迎大家指出,共同进步!!