Go语言面试题(一) 葵花宝典

自我介绍

-----

项目难点

  • 身份验证: 使用 Token (或 Session + Cookie)。
  • (Tips: 我的项目没有啥难点, 但也不能说没有难点啊!)

你还有什么想问我的吗 (反向面试)?

  • 公司招的实习生的主要工作内容?
  • 公司常用的技术栈是什么?
  • (面试中没有答出来的有意思的问题) 刚才的问题怎么回答 (反向狙击)

一、基础知识

为什么选择 Go语言?

Go语言

浅谈一下Go和Java有什么区别?

Go语言Go语言Java

浅谈一下 Go 和 C++ 有什么区别?

Go语言Go语言C++

go build 和 go run 有什么区别?

go buildgo run

Go语言中变量、init函数、main函数的执行顺序?

  • 首先初始化 导入包变量常量
  • 然后执行 导入包init函数
  • 然后初始化 本包变量常量
  • 然后执行 本包init函数
  • 最后执行 本包main函数
  • 注: 同一个包中多个init函数的执行顺序go语言没有明确的定义(说明)

Go语言 变量常量 命名规范?

公用UpperCamelCase私有lowerCamelCase常量命名UpperCamelCase

string 是基础的数据类型吗?基础类型有哪些?

String字节类型切片([]byte)intint8int16int32int64intuint8uint16uint32uint64float32float64boolbyteruneuintptr

int 和 int32 是同一个概念吗?

不是一个概念!

  • 如果是 32位 操作系统,int类型的大小就是4个字节
  • 如果是 64位 操作系统,int类型的大小就是8个字节

int32 能表示的数值范围是多少?

int32-2147483648 ~ 2147483647

uint32 能表示的数值范围是多少?

uint320 ~ 4294967295

char 型变量中能不能存贮一个中文汉字,为什么?

Go语言 中没有 char 类型,使用 byte 代替。

  • 通过 byte 处理 英文字符。(byte == int8 ≈≈ char)
  • 通过 rune 处理 中文字符。(rune == int32)
  • 英文数字一个字节
  • 中文 占一个字符,即 两个字节

byte (unit8) 表示的字符 怎么转换为 int 值?

myInt32 := '8'
fmt.Printf("myInt32-T: %T, myInt32: %v\n", myInt32, myInt32)
// 输出: myInt32-T: int32, myInt32: 56
fmt.Printf("myInt32-T: %T, myInt32: %c\n", myInt32, myInt32)
// 输出: myInt32-T: int32, myInt32: 8

myByte := byte(myInt32)
fmt.Printf("myByte-T: %T, myByte: %v\n", myByte, myByte)
// 输出: myByte-T: uint8, myByte: 56

myByte2 := myByte - '0'
fmt.Printf("myByte2-T: %T, myByte2: %v\n", myByte2, myByte2)
// 输出: myByte2-T: uint8, myByte2: 8
复制代码

简单介绍一下 rune类型?

  • rune类型 是类型 int32 的别名 (等价于int32),用来区分 字符值整数值
  • Go 语言通过 rune 处理 中文字符

iota 的含义和作用 (枚举?)?

iota

如何定义类型别名?

type myType = Type=import go_0110_XQZ "helloworld/go-0110-XQZ"

如何实现字符串反转?

  • 在Go语言中,需要自己实现 字符串反转 函数, 并且要区分 ASCII字符UTF-8等字符串。
  • 主要是通过 byte切片rune切片 来实现。
// 反转 ASCII 字符的方法
func reverseBytes(s string) string {
	r := []byte(s)
	for i := 0; i < len(s); i++ {
	    r[i] = s[len(s)-1-i]
	}
	return string(r)
}
复制代码

常用的字符串处理函数?

strings.Index()strings.Contains()strings.Replace()strings.Compare()

哪种字符串拼接方式最高效?

strings.Join()fmt.Sprintf()

string 和 []byte 相互转换的方法 (处理字节)?

string[]byte
var str string = "xqz"
var myBytes []byte = []byte(str)
var myStr = string(myBytes)
复制代码

string 和 []rune 相互转换的方法 (处理字符)?

string[]rune
var str string = "hello 谢清照"
var myRunes []rune= []rune(str)
var myStr = string(myRunes)
复制代码

谈谈 Go语言 中的 nil?

false0""nilnil指针类型unsafemapslicefunctionchannelinterface

浅谈一下 strconv 包?

strconv包

浅谈一下 big 包?

math/big

浅谈一下 flag 包?

flag命令行参数

浅谈一下 json 包?

json

import下划线(_)、点操作(.)的作用?

下划线(_)点操作(.)

new 和 make 的区别?

newmake

浅谈一下 switch语句?

switchcasefallthrough

函数支持 默认参数 或 可选参数 吗?

函数允许多个返回值吗?

可以。通常函数除了 返回值 还会返回一个 error

Go语言里有异常类型吗?

error类型try...catchpanicrecover

如何优雅的把 Go项目 部署到 Linux服务器?

set CGO_ENABLED=0    // 禁用CGO 
set GOOS=linux       // 目标平台为 linux 
set GOARCH=amd64     // 目标处理器架构是amd64 
go build -o name     // 编译可执行文件到当前目录 (-o:自定义文件名)
复制代码
.envconfig.ini

二、指针

值类型、指针类型、引用类型有什么区别?

值类型指针类型引用类型

Go语言中 指针运算 有哪些?

&*

Go语言里的 指针 有哪些 限制?

  • Go的 指针 不能进行 数学运算
  • 不同类型的 指针 不能 相互转换相互赋值

Go语言中的 引用类型 包含哪些?

引用类型

简述一下Go语言里的 interface?

Interface

简述一下 空接口 interface{})?空接口的应用?

空接口 (interface{})interface{}

调用函数传入结构体时,应该传 值 还是 指针?为什么?

  • 在不发生 内存逃逸 的情况下,传递指针 不会发生 内存拷贝,效率比 传递值 更高。
  • 发生 内存逃逸传递指针 的效率要比 传递值 更慢。

值接收者 和 指针接收者 (语法糖)?

  • 值类型 调用者既可以调用 值接收者 的方法,也可以调用 指针接收者 的方法。
  • 指针类型 调用者既可以调用 指针接收者 的方法,也可以调用 值接收者 的方法。

简单说一下 unsafe包?

unsafe包unsafe.Pointer

什么是链表?

链表是一种 线性表, 链表中每个 节点 存放的是指向下个 节点地址指针

三、容器

谈谈你对 Go语言 数组 的理解?

  • Go语言 中,数组值类型赋值函数传参 操作都会 复制整个数组

谈谈你对 切片(slice) 的理解?

切片(slice)

slice 和 数组 有什么区别?

数组切片(slice)

浅谈一下Go slice扩容机制?

oldcapnwecapnewcap = 2 * oldcap

如何比较两个字符串切片 (slice) 是否相等?

DeepEqual()

谈一谈 map[string]interface{} 数据格式

map[string]interface{}

如何判断 map 中 key 是否存在?

valueok
if value, ok := theMap["key1"]; ok {
    fmt.Printf(value)
} else {
    fmt.Println("key1 不存在")
}
复制代码

map 如何顺序读取?

map 中的 key 放入切片,对切片进行排序,遍历切片,通过 key 取值。

map 是线程安全的吗?

panic