陆续更新中....
# 基础篇
1.Golang具有哪些特点?
- Go是一种高级编程语言,具有垃圾回收和并发编程的支持,具有非常强的静态类型。
- 通过有助于有效管理依赖关系的包构建的。可生成二进制文件执行。Go具有强大的内置标准库,使用第三方包较少。对并发有高效的支持,能够使用多核处理器来为开发人员带来优势并有效地利用内存。
2.Golang有什么优势?
- 简单易懂、标准库强大、并发支持、静态类型检查、易于安装的二进制文件、良好的测试支持。
3.如何管理golang模块?
- 使用go get下载包,内置库不需要下载。
- 使用 go list -m all 获取所有库的情况
- 使用go mod tidy 清除不使用的模块。
- 使用go mod init 初始化新的模块在当前目录上。
- 使用go mod vendor 将依赖包加载到目录中。
- go.mod 生成,进行管理。并使用module http://github.com/xxx/xxx作为项目根目录查找。
- get get -u 小版本更新。
- 使用go.mod 中的exclude移除库版本 。
- 包管理工具glide。
4.Golang是否区分大小写?
- 区分大小写
5.Golang指针是什么?
- 指针保存任何变量地址的变量,也就是特殊变量。
- 运算符* 获取变量值,运算符&获取变量地址。
- 指针的目的:
- 允许函数变更传递给它的值。
- 对于大型数据结构的情况下,提高性能。使用指针有助于有效地复制大数据。
- 更方便JSON转换成结构体中,能避免0键值(key)。
6.反引号``和引号的区别?
- ``反引号可以使用$符号,且不间断字符串。
- ""引号可以中间间断字符串。
7.对goroutine的理解?
goroutine是golang中一个函数,通常与其他函数并发或并行运行。goroutines完全由Go运行时管理。
8.Go中切片是什么?
- 类似与数组的轻量级数据结构。灵活、方便、强大。
- Slice组件有:指针、长度、容量。
9.Go接口?
- 接口就是鸭子面向对象,混合类型。
- 充当:方法签名的集合、自定义类型。
10.为什么Go比其他语言快?
- 内存管理和并发模型。
- 编译过程快速、高效。
11.如何检查Go map是否包含key?
if val, isExists := map_obj["foo"]; isExists {} // 知道key值,复杂度O(1)
12.什么是Go 通道(channel),如何使用?
var channel_name chan Type // 创建通道
channel_name := make(chan Type) // 或者使用make创建
channel_name <- element // 使用<- 运算符发送到通道
element := <- Mychannel // 使用<- 接收
进阶篇
13.如何理解下面函数demo_func()?
type DemoStruct struct { Val int }
// A.通过赋值,返回结构体的副本
func demo_func() DemoStruct {
return DemoStruct{Val: 1}
}
// B.返回结构体的指针在函数中创建的值
func demo_func() *DemoStruct{
return &DemoStruct{}
}
// C.给结构体Val变量设置为1
func demo_func(s *DemoStruct){
s.Val = 1
}
14.可以不打印就格式化字符串吗?
return fmt.Sprintf("Size:%d MB.", 50)
15.Go的断言。
t := i.(T) // 断言语法,判断是否是类型T,否则引起panic
t, isSuccess := i.(T) // t用于返回的基础值,isSuccess用于判断是否断言完成
16.如何在运行时检查变量的类型?
switch v := params.(type) {
default:
fmt.Printf("Unexpected type %T",v)
case unit64:
fmt.Println("Integer")
case string:
fmt.Println("String")
}
17.是否推荐在实现goroutine的程序中使用全局变量?
- 不建议。因为在goroutine中使用全局变量,可能被多个goroutine同时访问和修改。这可能会导致意外和任意的结果。
18.slice和Map作为出参容易有什么问题?
- 出参会导致结构体被共享,产生原子竞争问题,导致同步锁失效
- 使用for range拷贝新的数据返回
19.指针和值有什么区别?
- 值类型接收体可以被结构体非指针和值引用。
- 指针类型接收体,只能被指针引用。
- 指针方法集,只有被指针接口匹配,值方法集可以被指针和值接口匹配。
20.struct结构体没有该类型定义,运行时报错。如何把该方法提出来在编译过程中报错?
采用断言方法,(*Handle)(nil)
var _ http.Handler = (*Handler)(nil)
相当于断言类型 http.Handler.(T) = nil
此处如果Handler没有接口http.Handler,则编译不过
21.go get 和 go install 区别?
go install安装在$GOPATH中
22.slice 和 array如何定义?
type Transform [3][3]float64 // A 3x3 array, really an array of arrays.
type LinesOfText [][]byte // A slice of byte slices.
- Slice应用更多,且没有长度。
- 数组定义:指针、长度、类型
23.[...]int{1,2,3}跟[]int{1,2,3} 有什么区别?
- 前者是数组,在{}取长度。
- 后者是切片。
陆续更新中....