文档章节

Go圣经-学习笔记入门-面试题

cdh0805010
 cdh0805010
发布于 2017/10/20 16:43
字数 772
阅读 388
收藏 9

常问面试题

  • 函数返回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。

© 著作权归作者所有

cdh0805010

cdh0805010

粉丝 38
博文 36
码字总数 42295
作品 4
深圳
私信 提问
分享AI有道干货 | 126 篇 AI 原创文章精选(ML、DL、资源、教程)

一年多来,公众号【AI有道】已经发布了 140+ 的原创文章了。内容涉及林轩田机器学习课程笔记、吴恩达 deeplearning.ai 课程笔记、机器学习、深度学习、笔试面试题、资源教程等等。值得一提的...

ApacheCN_飞龙
05/12
0
0
Go圣经-学习笔记入门bufio.Scanner

上一篇 Go圣经-学习笔记入门bufio 下一篇 Go圣经-学习笔记入门bufio.Writer 由bufio.Reader引出的问题 由上篇文章《Go圣经-学习笔记入门bufio》,我们可以知道,bufio.Reader结构体中所有读取...

cdh0805010
2017/10/21
235
0
BAT等大厂Android面试书单和知识点清单

java是Android开发的基础,在BAT的初面中,会涉及到比较多的java基础知识,所以比较重要,下面我介绍的书籍内容是由浅到深。 1.Thinking in java:这本书被称为Java的三大圣经之一,虽然书比...

android自学
2018/07/25
0
0
Go圣经-学习笔记之select多路复用

上一篇 Go圣经-学习笔记之并发循环 下一篇 Go圣经-学习笔记之并发的字典遍历 select多路复用 这个概念与socket网络编程中的select、poll和epoll中的select概念类似。其含义是有N个channel,只...

cdh0805010
2017/10/29
434
0
MoreWindows博客目录(微软最有价值专家,原创技术文章152篇)

为了方便大家查找和学习,现将本人博客中所有博客文章列出目录。 一. 白话经典算法 目前有17篇,分为七大排序和经典面试题讲解两大类 1. 《白话经典算法系列之一 冒泡排序的三种实现》 2. 《...

morewindows
2013/12/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

社区投稿 | 线程简介和 MySQL 调试环境搭建

作者:高鹏 文章末尾有他著作的《深入理解MySQL主从原理 32讲》,深入透彻理解MySQL主从,GTID相关技术知识。 本文节选自《深入理解MySQL主从原理》第29节 注意:本文分为正文和附件两部分,...

爱可生
18分钟前
4
0
DDOS攻击可以分为什么类型?怎么样才能解决?

DDoS 是一种多源网络攻击,其目的是针对终端用户扰乱其网络的资源或服务。其不断进化的复杂性能够造成各种各样的伤害,例如欺诈以及勒索等。DDoS 攻击通常透过多重受损的系统或者装置注入殭尸...

云漫网络Ruan
21分钟前
2
0
从零开始入门 K8s| 阿里技术专家详解 K8s 核心概念

作者| 阿里巴巴资深技术专家、CNCF 9个 TCO 之一 李响 一、什么是 Kubernetes Kubernetes,从官方网站上可以看到,它是一个工业级的容器编排平台。Kubernetes 这个单词是希腊语,它的中文翻译...

阿里巴巴云原生
21分钟前
3
0
修改和编译spring源码,构建jar(spring-context-4.0.2.RELEASE)

上周在定位问题时,发现Spring容器实例化Bean的时候抛出异常,为了查看更详细的信息,决定修改spring-context-4.0.2.RELEASE.jar中的CommonAnnotationBeanPostProcessor类的代码,在里面打印...

程序员欣宸
24分钟前
2
0
MongoDB集群配置

MongoDB集群配置 2019年06月30日 13:21:05 2014Team 阅读数 77更多 分类专栏: MongoDB 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文...

linjin200
24分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部