选择题(多选)
1.关于switch语句,下面说法正确的有()
A、条件表达式必须为常量或者整数
B、单个case中,可以出现多个结果选项
C、需要用break来明确退出一个case
D、只有在case中明确添加fallthough关键字,才会继续执行紧跟的下一个case
答案:BD
2.通过指针变量p访问其成员变量name,下面说法正确的是()
A、p.name
B、(*p).name
C、(&p).name
D、p->name
答案:AB
3.关于接口和类的说法,下面说法正确的是()
A、一个类只需要实现了接口要求的所有函数,我们就说这个类实现了该接口
B、实现类的时候,只需要关心自己应该提供哪些方法,不用再纠结接口需要拆得多细才合理
C、类实现接口时需要导入接口所在的包
D、接口由使用方按自身需求来定义,使用方无需关心是否有其他模块定义过类似的接口
答案:ABD
4.关于协程,下面说法正确的是()
A、协程和线程都可以实现程序的并发执行
B、线程比协程更轻量级
C、协程不存在死锁的问题
D、通过channel来进行协程间的通信
答案:AD
5.关于同步锁,下面说法正确的是()
A、当一个goroutine获得了Mutex后,其他goroutine就只能乖乖等待,除非该goroutine释放这个锁Mutex
B、RWMutex在读锁占用的情况下,会阻止写,但不阻止读
C、RWMutex在写锁占用情况下,会阻止任何其他goroutine(无论读和写)进来,相当于由该goroutine独占
D、Lock()操作需要保证有Unlock()和RUnlock()调用与之对应
答案:ABC
6.关于select机制,下面说法正确的是()
A、select机制用来处理异步IO问题
B、select机制最大的一条限制就是每个case语句里必须是一个IO操作
C、golang在语言级别支持select关键字
D、select关键字的用法与switch语句非常类似,后面要带判断条件
答案:ABC
7.下面的程序的运行结果是()
func main() {
if (true) {
defer fmt.Printf("1")
} else {
defer fmt.Printf("2")
}
fmt.Printf("3")
}
A、321
B、32
C、31
D、13
答案:c
8.下面赋值正确的是()
A、var x = nil
B、var x interface{} = nil
C、var x string = nil
D、var x error = nil
答案:BD
9.关于go vendor,下面说法正确的是()
A、基本思想是将引用的外部包的源代码放在当前工程的vendor目录下面
B、编译go代码会优先从vendor目录先寻找依赖包
C、可以指定引用某个特定版本的外部包
D、有了vendor目录后,打包当前的工程代码到其他机器的¥GOPATH/src下都可以通过编译
答案:ABD
10.关于异常设计,下面说法正确的是()
A、在程序开发阶段,坚持速错,让程序异常崩溃
B、在程序部署后,应恢复异常避免程序终止
C、一切皆错误,不用进行一场设计
D、对于不应该出现的分支,使用异常处理
答案:ABD
11.关于channel的特性,下面说法正确的是()
A、给一个nil channel发送数据,造成永远阻塞
B、给一个nil channel接收数据,造成永久阻塞
C、给一个已经关闭的channel发送数据,引起panic
D、从一个已经关闭的channel接收数据,如果缓冲区中为空,则返回一个零值
答案:ABCD
12.关于map,下面说法正确的是()
A、map反序列化时json.unmarshal的入参必须为map的地址
B、在函数调用中传递map,则子函数中对map元素的增加不会导致父函数中map的修改
C、在函数调用中传递map,则子函数中对map元素的修改不会导致父函数中map的修改
D、不能使用内置函数delete删除map的元素
答案:A
13.从切片中删除一个元素,下面的算法实现正确的是()
A、
func (s *Slice) Remove(value interface{}) {
for i, v := range *s {
if isEqual(value ,v){
if !== len(*s) - 1 {
*s = (*s)[:i]
}else{
*s = append((*s)[:i], (*s)[i + 2]...)
}
return
}
}
}
B、
func (s *Slice) Remove(value interface{}) {
for i, v := range *s {
if isEqual(value, v) {
*s = append((*s)[:i], (*s)[i+1:])
return
}
}
}
C、
func (s *Slice) Remove(value interface{}) {
for i, v := range *s {
if isEqual(value, v) {
delete(*s, v)
return
}
}
}
D、
func (s *Slice) Remove(value interface{}) {
for i, v := range *s {
if isEqual(value, v) {
*s = append((*s)[:i], (*s)[i+1:]...)
return
}
}
}
答案:D
14.下面协议中,用于电子邮件email传输控制的是()
A、SNMP
B、SMTP
C、HTTP
D、HTML
答案:B
15.在TCP/IP协议簇中,UDP协议工作在()
A、应用层
B、传输层
C、网络互联层
D、网络接口层
答案:B
16.下列关于TCP说法正确的有()
A、TCP提供稳定的传输服务
B、TCP有流量控制
C、TCP冗余性好
D、TCP提供对IP协议的可靠机制,流控制以及错误恢复功能
答案:A
17.完成TLS握手完整的过程需要下面哪些算法()
A、密钥交换算法
B、对称加密算法
C、多点共识算法
D、消息认证算法
答案:AB
18.关于DNS协议以下说法错误的是()
A、使用TCP协议进行传输
B、使用UDP协议进行传输
C、可以进行从域名到ip的解析
D、可以根据ip查询其使用的域名
答案:BCD
19.-5的二进制表示是()
A、00000000 00000000 00000000 00000101
B、11111111 11111111 11111111 11111010
C、11111111 11111111 11111111 11111011
D、10000000 00000000 00000000 00000101
答案:C
20.索引是对数据库中一个或多个列的值进行排序的数据结构,以协助快速查询,更新数据库表中数据,以下对索引的特点描述错误的是()
A、加快数据的检索速度
B、加速表和表之间的连接
C、在使用分组和排序子句进行数据检索时,并不会减少查询中分组和排序的时间
D、通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性
答案:ABD
提高题
21.简要说明在浏览器输入http://nyssl.com后发生了什么?
例子一:
1)在客户端浏览器中输入网址http://nyssl.com
2)发送到DNS(域名服务器)获得域名对应的WEB服务器的IP地址
3)有了IP后,客户端浏览器就可以与WEB服务器建立TCP(传输控制协议)连接
4)客户端浏览器向对应IP地址的WEB服务器发送相应的HTTP或HTTPS请求
5)WEB服务器收到客户端请求,返回给用户指定的URL数据或错误信息;如果设定重定向,则重定向到新的URL地址,重新开始第一步
6)客户端浏览器解析HTML源文件,解析的过程中实现对页面的排版,解析完成后,在浏览器中显示基础的页面
7)分析页面中的超链接(如图片,样式等也是一个URL),过程和以上过程类似,之后再显示在当前页面,重复以上过程直至没有超链接需要发送,完成页面的全部加载
例子二:
1)输入网址
2)缓存解析
3)域名解析
4)获取相应的IP
5)建立TCP连接三次握手
6)和服务器建立连接
7)浏览器发送HTTP请求数据包
8)浏览器渲染
9)生成CSS树和AST树,合成dom树
10)js请求
11)ajax查询
12)页面生成
13)断开连接4次握手
22.简述实现一个博客评论系统(类似disqus/多说等)的思路。
(提示:从技术选型,设计思路,数据库设计等方面作答)
简答题
1.Golang如何实现多态
package main
import "fmt"
type AnimalIF interface {
Sleep()
Age() int
Type() string
}
type Animal struct {
MaxAge int
}
// ***********************************
type Cat struct {
Animal Animal
}
func (this *Cat) Sleep() {
fmt.Println("Cat need sleep")
}
func (this *Cat) Age() int {
return this.Animal.MaxAge
}
func (this *Cat) Type() string {
return "Cat"
}
//************************************
type Dog struct {
Animal Animal
}
func (this *Dog) Sleep() {
fmt.Println("Dog need sleep")
}
func (this *Dog) Age() int {
return this.Animal.MaxAge
}
func (this *Dog) Type() string {
return "Dog"
}
//************************************
func facroty(name string) AnimalIF {
switch name {
case "Dog":
return &Dog{Animal{MaxAge: 25}}
case "Cat":
return &Cat{Animal{MaxAge: 15}}
default:
panic("No such animal")
}
}
func main() {
animal := facroty("Dog")
animal.Sleep()
fmt.Printf("%s max age is: %d\n", animal.Type(), animal.Age())
}
2.Golang传递参数到方法有几种方式,及其各自的特点
值对象:
指针传递:地址传递效率高,因为数据量小
3.谈谈new和make的区别
new:只分配内存,new用于各种类型的内存分配,new只返回指针;
make:只能用于 slice、map 和 channel 的初始化,make用于内建类型(Map、slice和channel)的内存分配,make返回初始化后的(非零)值
4.谈谈array和slice的区别
array:类型相同,长度固定的数据集合,长度无法修改;类型为——[len]T(len不能省略);值是一段连续的内存区域和一些额外属性
slice:可以看做是内存的视图,展示内存的一段区域;类型为[]T;值是一个指向内存的数据结构,类似指向数组的指针
5.Context包的用途
context用于停止goroutine,协调多个goroutine的取消,设置超时取消等等。基于channel和select来实现停止,另外还可以用context在不同的goroutine中传递数据。其中停止goroutine是context的核心。
6.简述Golang中的协程
Go协程(Goroutine)是与其他函数同时运行的函数。可以认为Go协程是轻量级的线程,由Go运行时来管理。
在函数调用前加上go关键字,这次调用就会在一个新的goroutine中并发执行。当被调用的函数返回时,这个goroutine也自动结束。听着感觉像C# 中的Task。
需要注意的是,如果这个函数有返回值,那么这个返回值会被丢弃。
Go 协程(Goroutine)之间通过信道(channel)进行通信,简单的说就是多个协程之间通信的管道。信道可以防止多个协程访问共享内存时发生资源争抢的问题。
7.写出下面代码的输出结果
package main
import "fmt"
func main() {
defer_call()
}
func defer_call() {
defer func() { fmt.Println("before print") }()
defer func() { fmt.Println("printing...") }()
defer func() { fmt.Println("after print") }()
panic("Exception")
}
after print
printing...
before print
panic: Exception
goroutine 1 [running]:
main.defer_call()
/home/udi/Udi_work_space/Udi_ws_go/ZipTest_backend/main.go:13 +0x70
main.main()
/home/udi/Udi_work_space/Udi_ws_go/ZipTest_backend/main.go:6 +0x17
exit status 2
8.谈谈你对SOLID原则的理解
9.git rebase和git merge的区别
10.如果用户登录日志表包含user_id,log_time,session_id 等字段,请编写SQL查询近30天,每天平均登录用户数量
select count(user_id) as num, to_char(log_time, 'yyyy/mm/dd') as date
from login_log
where log_time between sysdate-30 and sysdate
group by to_char(log_time, 'yyyy/mm/dd')
order by to_char(log_time, 'yyyy/mm/dd') desc