Go圣经-学习笔记入门-面试题
2017-10-20 00:00
447 查看
摘要: Go,面试基础知识
普通函数和闭包函数的区别有哪些?后者的应用场景在哪里?(闭包函数使用外部变量,是引用传递,注意:闭包函数运行时使用到该变量时,获取当时该变量的值。应用场景:闭包函数要比较小,有点像内联函数,用于defer等其他场景-关闭连接等)
make和new有什么区别(make用于channel、map和slice的创建并初始化零值。new是指针对象。Effective Go中有个例子)
更通俗易懂的例子, new是指针对象,而make是值对象
bufio是golang标准库,表示缓冲IO的意思,可读可写。通过bufio标准库,实现对输入数据的读取、处理和输出操作
我们可以由此了解并使用bufio库中常用的方法:
bufio实现了io.Reader和io.Writer接口, 所以可读可写。
bufio.Reader作用是把oldReader的数据读取到缓冲区,它的常用方法列表
bufio.Reader使用DEMO:
这里要平时注意的一点:var bts = make([]byte, 100), 需要初始化。slice类型变量首先要初始化, 如果不初始化,则如果在调用的方法体内初始化,则返回时,slice类型变量还是旧值。原因说明:
slice底层实际上是struct结构体类型,有len,cap和指针数组组成。所以函数体内初始化则内存地址和传入的内存地址不是一致的,读到的数据是旧的
如果传入参数是初始化的,则相当于func(temp=Struct{}/传入参数param/), 虽然地址不一样,但是重新赋值了,且len、cap值相同,底层的指针数组还是指向一样的内存地址,如果底层数组的内存地址存放的数据发生变化,由于指向数组的指针没有变化,则传入参数可是指向了底层数组新的数据。
结论:所以凡是遇到slice类型变量,作为参数传入时,都需要进行make初始化,且指定slice的长度len。
常问面试题
函数返回return XX, 是原子操作吗?(不是, 如果你看过雨痕老师的内存管理,就知道)普通函数和闭包函数的区别有哪些?后者的应用场景在哪里?(闭包函数使用外部变量,是引用传递,注意:闭包函数运行时使用到该变量时,获取当时该变量的值。应用场景:闭包函数要比较小,有点像内联函数,用于defer等其他场景-关闭连接等)
make和new有什么区别(make用于channel、map和slice的创建并初始化零值。new是指针对象。Effective Go中有个例子)
var p *[]int = new([]int) // p=nil, 没有任何用处,只是分配了一个指针对象 var v []int = make([]int, 100) // 而make则分配了长度和容量等于100,并且初始化零值的对象 // 复杂方法: var p *[]int = new([]int) *p = make([]int, 100, 100) // 常用方法: v := make([]int, 100)
更通俗易懂的例子, new是指针对象,而make是值对象
func newInt() *int { return new(int) } func newInt() *int { var dummy int return &dummy }
查找重复行
代码片段func findDup() { scanner:=bufio.NewScanner(os.Stdin) for scanner.Scan(){ maps[scanner.Text()]++ } for line, count := range maps{ if count >0 { fmt.Printf("line: %s, count: %d\n", line, count) } } }
bufio是golang标准库,表示缓冲IO的意思,可读可写。通过bufio标准库,实现对输入数据的读取、处理和输出操作
我们可以由此了解并使用bufio库中常用的方法:
bufio实现了io.Reader和io.Writer接口, 所以可读可写。
bufio.Reader作用是把oldReader的数据读取到缓冲区,它的常用方法列表
reader:=bufio.NewReader(oldReader) // 默认size为4096 reader:=bufio.NewReaderSize(oldReader, size) bytes, error = reader.ReadSlice(delim/*结束符*/) bytes, error = reader.ReadString(delim) bytes, error = reader.ReadLine() // 默认换行符\n bytes, error = reader.ReadBytes(delim) n, error = reader.Reader([]byte)
bufio.Reader使用DEMO:
reader:=bufio.NewReader(strings.NewReader("ABCDEFG\nHIJKLMN\n") var bts = make([]byte, 100) // 注意点:需要初始化 _, err = reader.Read(bts)
这里要平时注意的一点:var bts = make([]byte, 100), 需要初始化。slice类型变量首先要初始化, 如果不初始化,则如果在调用的方法体内初始化,则返回时,slice类型变量还是旧值。原因说明:
slice底层实际上是struct结构体类型,有len,cap和指针数组组成。所以函数体内初始化则内存地址和传入的内存地址不是一致的,读到的数据是旧的
如果传入参数是初始化的,则相当于func(temp=Struct{}/传入参数param/), 虽然地址不一样,但是重新赋值了,且len、cap值相同,底层的指针数组还是指向一样的内存地址,如果底层数组的内存地址存放的数据发生变化,由于指向数组的指针没有变化,则传入参数可是指向了底层数组新的数据。
结论:所以凡是遇到slice类型变量,作为参数传入时,都需要进行make初始化,且指定slice的长度len。
相关文章推荐
- Go圣经-学习笔记入门bufio.Writer
- Go圣经-学习笔记入门bufio.Scanner
- Go圣经-学习笔记入门bufio
- Go圣经-学习笔记入门
- Go圣经-学习笔记之error接口
- Go圣经-学习笔记之函数值(二)
- Go圣经-学习笔记之函数和错误处理
- Go圣经-学习笔记之封装还是组合
- Go圣经-学习笔记之复合类型(三)
- Go圣经-学习笔记目录
- Go圣经-学习笔记之并发的字典遍历
- Go圣经-学习笔记之方法
- Go圣经-学习笔记之http.Handler接口
- Go圣经-学习笔记之select多路复用
- Go语言学习笔记 --- 入门介绍
- Go圣经-学习笔记之基础数据类型
- Go圣经-学习笔记之defer和异常处理
- Go圣经-学习笔记之复合类型(二)
- Go圣经-学习笔记之接口
- Go圣经-学习笔记绪论