golang笔试题(实例)

选择题(多选)

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
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值