Golang 面试题 I

成为Go开发工作者已经2个多月了, 是时候通过一些面试题笔试题提升自己了

结构体是否可以直接寻地址

什么叫可寻址

可直接使用&操作符取地址的对象,就是可寻址

哪些是可以寻址的

变量 &x

1
2
name := "caoxl"
fmt.Println(&name)

指针 &*x

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main

import (
"fmt"
"unsafe"
)

func main() {
fmt.Println(unsafe.Pointer(&person{"caoxl"}))
}

type person struct {
name string
}

数组元素索引 &a[0]

1
2
a := [3]int{1, 2, 3}
fmt.Printf("%p\n", &a[0])

切片

1
fmt.Println([]int{1, 2, 3}[1:])

切片元素索引 &s[0]

1
2
s := []int{1, 2, 3}
fmt.Println(&s[0])

哪些是不可以寻址的

常量

字符串

函数或方法

有方向的channel是否可以关闭

因为关闭操作只用于断言不再向channel发送新的数据,所以只有在发送者所在的goroutine才会调用close函数,因此对一个只接收的channel调用close将是一个编译错误。

for range和for对channel遍历的区别

for range 中,参与循环表达式的只是对象的副本

context超时控制

利用 context.WithTimeout() 方法会返回一个具有超时功能的上下文。

cron定时

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package main

import (
"fmt"
"github.com/robfig/cron/v3"
"time"
)

func main() {
c := cron.New(cron.WithSeconds())
// 含义查看下文表达式示例
c.AddFunc("0/7 * * * * *", func() {
fmt.Println(time.Now().Format("2006-01-02 15:04:05"))
})
c.Start()
time.Sleep(300 * time.Second)
}

embed包的作用

embed是在Go 1.16中新加入的包。它通过//go:embed指令,可以在编译阶段将静态资源文件打包进编译好的程序中,并提供访问这些文件的能力。

为什么需要 embed 包

在以前,很多从其他语言转过来Go语言的同学会问到,或者踩到一个坑。就是以为Go语言所打包的二进制文件中会包含配置文件的联同编译和打包。

结果往往一把二进制文件挪来挪去,就无法把应用程序运行起来了。因为无法读取到静态文件的资源。

哪些类型可以和nil比较

nil是一个预先声明的标识符,代表指针(pointer)、通道(channel)、函数(func)、接口(interface)、map、切片(slice)。也可以这么理解:指针、通道、函数、接口、map、切片的零值就是nil,就像布尔类型的零值是false、整型的零值是0。

nil标识符的比较

1
fmt.Println(nil== nil)

==符号对于nil来说是一种未定义的操作,所以是不可以比较两个nil的

nil的值比较

1
2
3
4
5
6
7
8
9
10
11
12
13
14
func main()  {
// 指针类型的nil比较
fmt.Println((*int64)(nil) == (*int64)(nil))
// channel 类型的nil比较
fmt.Println((chan int)(nil) == (chan int)(nil))
// func类型的nil比较
fmt.Println((func())(nil) == (func())(nil)) // func() 只能与nil进行比较
// interface类型的nil比较
fmt.Println((interface{})(nil) == (interface{})(nil))
// map类型的nil比较
fmt.Println((map[string]int)(nil) == (map[string]int)(nil)) // map 只能与nil进行比较
// slice类型的nil比较
fmt.Println(([]int)(nil) == ([]int)(nil)) // slice 只能与nil进行比较
}
  • 运行结果
1
2
3
4
# command-line-arguments
./nil.go:13:28: invalid operation: (func())(nil) == (func())(nil) (func can only be compared to nil)
./nil.go:17:36: invalid operation: (map[string]int)(nil) == (map[string]int)(nil) (map can only be compared to nil)
./nil.go:19:27: invalid operation: ([]int)(nil) == ([]int)(nil) (slice can only be compared to nil)

从运行结果我们可以看出,指针类型nilchannel类型的nilinterface类型可以相互比较,而func类型map类型slice类型只能与nil标识符比较,两个类型相互比较是不合法的。

fallthrouth是否可以用在断言

fallthrouth

fallthrough:Go里面switch默认相当于每个case最后带有break,匹配成功后不会自动向下执行其他case,而是跳出整个switch, 但是可以使用fallthrough强制执行后面的case代码。

断言

类型断言(Type Assertion)是一个使用在接口值上的操作,用于检查接口类型变量所持有的值是否实现了期望的接口或者具体的类型。

断言还有一种形式,就是使用「switch语句」判断接口的类型

Powered by Hexo and Hexo-theme-hiker

Copyright © 2017 - 2023 Keep It Simple And Stupid All Rights Reserved.

访客数 : | 访问量 :