A. 一个类只需要实现了接口要求的所有函数,我们就说这个类实现了所有接口
B. 实现类的时候,只需要关心自己应该提供哪些方法,不用再纠结接口需要拆得多细才合理
C. 类实现接口时,需要导入接口所在的包
D. 接口由使用方法按自身需求来定义,使用方无需关心是否有其他模块定义过类似的接口
A. 协程和线程都可以实现程序的并发执行
B. 线程比协程更轻量级
C. 协程不存在死锁问题
D. 通过channel来进行协程间的通信
A. 一个包中,可以包含多个init函数
B. 程序编译时,先执行导入包的init函数,在执行本包内的init函数
D. init函数可以被其他函数调用
B. 关键字for的基本使用方法与C/C++中没有任何差异
C. for循环支持continue和break来控制循环,但是它提供了一个更高级的break,可以选择中断哪一个环节
D. for循环不支持以逗号为间隔的多个赋值语句,必须使用平行赋值的方式来初始化多个变量
A. 条件表达式必须为常量或者整数
B. 单个case中,可以出现多个结果选项
D. 只有在case中明确添加fallthrough关键字,才会继续执行紧跟的下一个case
A. 方法施加的对象显式传递,没有被藏起来
B. golang沿袭了传统面向对象编程中的诸多概念,比如继承、虚函数和构造函数
C. golang的面向对象表达更直观,对于面向过程只是换了一种语法形式来表达
D. 方法施加的对象不需要非得是指针,也不用非得叫this
A. 可以对指针进行自增或自减运算
B. 可以通过“&”取指针的地址
C. 可以通过“*”取指针指向的数据
D. 可以对指针进行下标运算
B. main函数不能定义返回值
D.main函数中可以使用flag包来获取和解析命令行参数
则Add函数定义正确的是()
则Add函数定义正确的是()
A. 只要两个接口拥有相同的方法列表(次序不同不要紧),那么它们就是等价的,可以互相赋值
B. 如果接口A的方法列表是接口B的方法列表的子集,那么接口B可以赋值给接口A
C. 接口查询是否成功,要在运行期才能够确定
D. 接口赋值是否可行,要在运行期才能够确定
B. RWMutex在读锁占用的情况下,会阻止写,但不阻止读
C. RWMutex在写锁占用情况下,会阻止任何其他goroutine(无论读和写)进来,整个锁相当于由该goroutine独占
A. 基本思想是将引用的外部包的源代码放在当前工程的vendor目录下面
B. 编译go代码会优先从vendor目录先寻找依赖包
C. 可以指定引用某个特定版本的外部包
D. 有了vendor目录后,打包当前的工程代码到其他机器的¥GOPATH/src下都可以通过编译
A. 如果失败原因只有一个,则返回bool
B. 如果失败原因超过一个,则返回error
C. 如果没有失败原因,则不返回bool或error
D. 如果重试几次可以避免失败,则不要立即返回bool或error
A. 在程序开发阶段,坚持速错,让程序异常崩溃
B. 在程序部署后,应恢复异常避免程序终止
C. 一切皆错误,不用进行异常设计
D. 对于不应该出现的分支,使用异常处理
D. 从一个已经关闭的channel接收数据,如果缓冲区中为空,则返回一个零值
B. beego可以通过注释路由、正则路由等多种方式完成url路由注入
C. 可以使用bee new工具生成空工程,然后使用bee run命令自动热编译
D. beego框架只提供了对url路由的处理,而对于MVC架构中的数据库部分未提供框架支持
B. goconvey能够自动监控文件修改并启动测试,并可以将测试结果实时输出到web界面
C. goconvey提供了丰富的断言简化测试用例的编写
B. 在函数调用中传递map,则子函数中对map元素的增加不会导致父函数中map的修改
C. 在函数调用中传递map,则子函数中对map元素的修改不会导致父函数中map的修改
D. 不能使用内置函数delete删除map的元素
C. GoStub可以对类的成员方法打桩
D. GoStub可以打动态桩,比如对一个函数打桩后,多次调用该函数会有不同的行为
B. select机制最大的一条限制就是每个case语句里必须是一个IO操作
D. select关键字的用法与switch语句非常类似,后面要带判断条件
A. golang有自动垃圾回收,不存在内存泄漏
C. 内存泄漏可以再编译阶段发现
D. 应定期使用浏览器来查看系统的实时内存信息,及时发现内存泄漏问题
Test
考点:defer先后顺序
defer是后进先出的
panic需要等到defer结束后才会向上传递。出现panic恐慌时候,会先按照defer的后入先出的顺序执行,最后才执行panic。
这样的写法初学者经常会遇到的,很危险!与Java的foreach一样,都是使用副本的方式。所以 m[stu.Name]=&stu实际上一致指向同一个指针,最终该指针的值为遍历的最后一个struct的值拷贝。就像想修改切片元素的属性:
也是不可行的。大家可以试试打印出来:
考点:go执行的随机性和闭包
谁也不知道执行后打印的顺序是怎么样的,所以只能说是随机数字。但是A:均为输出10,B:从0~9输出(顺序不定)。第一个go func中i是外部for的一个变量,地址不变化。遍历完成后,最终i=10.。故go func执行时,i的值始终是10。
第二个go func中i是函数参数,与外部for中的i完全是两个变量。尾部(i)将发生值拷贝,go func内部指向值拷贝地址。
解答:这是Golang的组合模式,可以实现OOP的继承,被组合的类型People所包含的方法虽然升级成了外部类型Teacher这个组合类型的方法(一定要是匿名字段),但它们的方法(ShowA())调用时接受者并没有发生变化。此时People类型并不知道他们会变什么类型组合,当然也就无法调用方法时去使用未知的组合者Teacher类型的功能。
select会随机选择一个可用通用做收发操作。所以代码是有可能触发异常,也有可能不会。单个chan如果无缓冲时,将会阻塞。但结合select可以在多个chan间等待执行。有三点原则:
当如果同一时间有多个case均能return则伪随机方式抽取任意一个执行。
make初始化是有默认值的,此处默认值为0
看到这道题目,我也在猜想出题者的意图在哪里。chan?sync.RWMutex?go?chan缓存池?迭代?所以只能再读一次题目,就从迭代入手看看,既然是迭代就会要求ste.s全部可以遍历一次。但是chan是为缓存的,那就代表写入一次就会阻塞。我们把代码恢复为可以运行的方式,看看效果
考点:golang的方法集
编译不通过!做错了!?说明你对golang的方法集还有一些疑问。一句话:golang的方法集仅仅影响接口实现和方法表达式转化,与通过实例或者指针调用方法无关。
可以看出iface比eface中间多了一层itab结构。itab存储_type信息和[]fun方法集,从上面的结构我们就可得出,因为data指向了nil并不代表interface是nil,所以返回值并不为空,这里的fun(方法集)定义了接口的接收规则,在编译过程中需要验证是否实现接口
在函数有多个返回值时,只要有一个返回值有指定命名,其他的也必须有命名。如果返回值有多个,返回值必须加上括号;如果只有一个返回值并且有命名也需要加上括号;此函数第一个返回值有sum名称,第二个未命名,所以错误。
考点:defer和函数返回值
需要明确一点是defer需要在函数结束前执行。函数返回值名字会在函数起始处被初始化为对应类型的零值并且作用域为整个函数。DeferFunc1有函数返回值t作用域为整个函数,在return之前defer会被执行,所以t被修改了,返回4;DeferFunc2函数中t的作用域为函数,返回1;DeferFunc3,返回3
append会把第二个参数进行切片,需要在s2后面加上“…”,该程序才能编译通过
进行结构体比较时,只有相同类型的结构体才可以比较,结构体是否相同不但与属性类型个数有关,还与属性顺序相关
sn3与sn1就不是相同的结构体了,不能比较。还有一点需要注意的是结构体是相同的,但是结构体属性中有不可以比较的类型,如map,slice。如果该结构属性都是可以比较的,那么就可以使用“==”进行比较操作。
变量简短模式限制:定义变量同时显式初始化;不能提供数据类型;只能在函数内部使用
常量不同于变量的在运行期分配内存,常量通常会被编译器在预处理阶段直接展开,作为指令数据使用
goto不能直接跳转到其他函数或者内层代码
基于一个类型创建一个新类型,称之为defintion;基于一个类型创建一个别名,称之为alias。Myint1为称之defintion,虽然底层类型为int类型,但是不能直接赋值,需要强转;Myint2称之为alias,可以直接赋值
因为MyUser2完全等价于User,所以具有其所有的方法,并且其中一个新增了方法,另一个也会有。但是i1.m2()是不能执行的,因为MyUser1没有定义该方法。
不能正常编译,异常:ambiguous selector m1
。结果不限于方法,字段也一样;也不限于type alias,type defintion也是一样的,只要有重复的方法、字段,就会有这种提示,因为不知道该选择哪个。改为:
type alias的定义,本质上是一样的类型,只是起了一个别名,源类型怎么用,别名类型也怎么用,保留源类型的所有方法、字段等
因为if语句块内的err变量会遮罩函数作用域内的err变量,结果:
for循环复用局部变量i,每一次放入匿名函数的应用都是想一个变量。结果
如果想不一样可以改为:
考点:闭包引用相同变量*
考点:panic仅有最后一个可以被recover捕获
1)swift,貌似官网的推荐
我使用后者,用起来比较爽,上代码
首先Lua执行的每一段代码都称之为“程序块”,一个程序块也就是一连串的语句或命令,例如一个源码文件或一行代码.Lua语句之间并不需要分隔符,如代码中的换行就不起任何作用,当然为了养成编码习惯当两条或者 ...
Java虽然利用JVM,让程序员可以放心大胆的使用,可是仍然会出现内存泄露等问题.世上没有绝对的银弹,因此也不能完全把所有的任务都交给JVM,了解Java中的初始化与垃圾回收还是必不可少的知识. 关于 ...
移动端HTML5性能优化 [导读] 得益于智能手机的普及和各行各业互联网+的运动,移动端的市场占比疯狂增长. 2016年1月发布的2015年电商数据显示,2015年中国移动端网购交易额同比暴涨123 ...
这段时间做一个项目:使用 thinkphp 做了一个自动验证,但是发现如果新增的时候,是能够进行自动验证的,但是在修改的修改的时候,会发现自动验证会失效. 验证的时候,模型是这样写的: protect ...
题目大意:求一个使带宽最小的排列和最小带宽.带宽是指一个字母到其相邻字母的距离最大值. 题目分析:在递归生成全排列的过程中剪枝,剪枝方案还是两个.一.当前解不如最优解优时,减去:二.预测的理想解不必最 ...
(1)指针常量,将指针的指向当成常量.即指针变量的值只能在定义的时候初始化,定义后不能修改,也就是说不能改变指针变量的指向.但是不影响所指对象的访问特征.其定义形式为: 类型 * const 指针 / ...