博主是2017届的应届生,主要掌握的语言是java,后面在实习的时候,自学了golang,期间也是做了一些小东西,实习结束后,开始投入到找工作的大流中,所以想把面试中遇到的各种问题记录起来方便学习,同时也希望能对其他找工作的同学有点帮助吧,有些问题是经过查资料整理的,感谢提供答案的大家。好了,废话不多说,我们下面开始。文笔不好,望谅解。
第一次
这家公司是做游戏的,我当时面的golang开发,下面是hr问的技术相关的问题。
1.go语言有些什么特点?
答:编译型语言,部署简单,并发性好,自动垃圾回收,完善简便的各种类库,适用于大规模高并发后端服务器程序开发
2.如何清空mysql表中的所有数据?
答:truncate table 表名;
3.git有什么特点?(ps:这面试官老喜欢问这种有啥特点特点之类的。。)
答:1.版本库本地化,支持离线提交,相对独立不影响协同开发,2.把内容按元数据方式存储,完整克隆版本库 ,3.支持快速切换分支方便合并,4.分布式版本库,无单点故障,内容完整性好
4.docker的基本命令,如何给容器添加映射端口?linux如何在后台启动一个服务?
答:提交一个运行中的容器为镜像
docker commit containerid foo/live
运行镜像并添加端口
docker run -d -p 8000:80 foo/live /bin/bash
后台启动一个linux服务命令:(1).通过增加一个(&)符号,将应用程序在后台启动,如:libreoffice &. 此操作在关闭终端时服务也会停止
(2).nohup conmmand & 该命令可以在你退出帐户之后继续运行相应的进程。nohup就是不挂起的意思( no hang up)
拓展:
bg
将一个在后台暂停的命令,变成继续执行
fg
将后台中的命令调至前台继续运行
jobs
查看当前有多少在后台运行的命令
ctrl + z
可以将一个正在前台执行的命令放到后台,并且暂停
5. 接触过sql优化吗?
答:一般采取简历索引来加快检索速度。
还有一些问题忘记了,记忆深刻的就这几个。
第二次
这家公司是做旅游行业的,我当时也是面的golang web开发。下面是相关问题:
1.当打开浏览器输入url到打开网页,这当中发生了什么?
这个问题当时还真把我问蒙了,只知道dns要根据域名去查找对应的IP返回,浏览器在访问对应IP的服务器,当时答的也不理想。回来查了一下,竟然是百度的面试题,醉了,总的来说分为下面几个过程。
(1). DNS解析
(2). TCP连接
(3). 发送HTTP请求
(4). 服务器处理请求并返回HTTP报文
(5). 浏览器解析渲染页面
(6). 连接结束
具体细节涉及知识较多太过复杂,这里就不细说了,感兴趣的同学可以参考下面两篇博文
2.restful熟悉吗?都有哪些请求方法,分别代表什么意思?
答:restfual分别有GET POST PUT DELETE TRACE HEAD OPTIONS PATCH 等几种请求方法
POST : POST请求通常用来创建一个实体,也就是一个没有ID的资源。
GET:从服务器取回数据(只是取回数据,而不会产生其他的影响)。这是一个幂等的方法(译者注:使用相同的参数重复执行,应该能够获取到相同的结果)。
PUT :PUT请求和POST请求类似,但是一般用来更新一个已有的实体。通过把已经存在的资源的ID和新的实体用PUT请求上传的服务器,来更新资源。
DELETE : DELETE方法用来从服务器上删除资源。和PUT类似,你需要把要删除的资源的ID上传给服务器。
TRACE:测试当一个请求发生的时候,服务器通过网络收到的内容。所以,它会返回你发送的内容。
HEAD:HEAS请求和GET请求资源类似,但是仅仅返回响应的头部(没有具体的响应体)。
OPTIONS :OPTIONS方法允许客户端请求一个服务所支持的请求方法。它所对应的响应头(response header)是Allow, 它非常简单地列出了支持的方法。
比如:
200 OK
Allow: HEAD,GET,PUT,DELETE,OPTIONS
PATCH:PATCH方法是新引入的,是对PUT方法的补充,用来对已知资源进行局部更新。这里对局部的理解,可以参考下面:
3. TCP和UDP有什么区别?
答:TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快
总结:1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
4. token一般需要什么验证?怎么使用?
答:一般需要提供用户名密码,将token加到请求头中进行使用
5. 对golang的request和reponse建模,写出相关的属性和方法。
答:这个问题问的有点无语,我就列一下常用的吧,更详细的内容还是得去查看api文档。
发送http请求:
resp, err := http.Get("http://example.com/")
resp, err := http.Post("http://example.com/upload", "image/jpeg", &buf)
resp, err := http.PostForm("http://example.com/form",
url.Values{"key": {"Value"}, "id": {"123"}})
req, err := http.NewRequest("GET", "http://example.com", nil)
resp, err := client.Do(req)
添加请求头:
req.Header.Add("If-None-Match", `W/"wyzzy"`)
读取返回体的内容:
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
使用指定的监听地址和处理器启动一个HTTP服务端:
package main
import (
"fmt"
"log"
"net/http"
)
// w表示response对象,返回给客户端的内容都在对象里处理
// r表示客户端请求对象,包含了请求头,请求参数等等
func index(w http.ResponseWriter, r *http.Request) {
// 往w里写入内容,就会在浏览器里输出
fmt.Fprintf(w, "Hello golang http!")
}
func main() {
// 设置路由,如果访问/,则调用index方法
http.HandleFunc("/", index)
// 启动web服务,监听9090端口
err := http.ListenAndServe(":9090", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
request的一些属性和方法:
属性:
URL *url.URL
// 接收到的请求的协议版本。本包生产的Request总是使用HTTP/1.1
Header Header
//请求头
Body io.ReadCloser
//请求体
Form url.Values
// // Form是解析好的表单数据,包括URL字段的query参数和POST或PUT的表单数据。
// 本字段只有在调用ParseForm后才有效。在客户端,会忽略请求中的本字段而使用Body替代。
PostForm url.Values
//// PostForm是解析好的POST或PUT的表单数据。
// 本字段只有在调用ParseForm后才有效。在客户端,会忽略请求中的本字段而使用Body替代。
MultipartForm *multipart.Form
// MultipartForm是解析好的多部件表单,包括上传的文件。
// 本字段只有在调用ParseMultipartForm后才有效。
// 在客户端,会忽略请求中的本字段而使用Body替代。
方法:
func (r *Request) AddCookie(c *Cookie) //添加cookie
func (r *Request) SetBasicAuth(username, password string) //SetBasicAuth使用提供的用户名和密码,采用HTTP基本认证
func (r *Request) Write(w io.Writer) error //将w写入到request的相关属性中
func (r *Request) ParseForm() error //ParseForm解析URL中的查询字符串,并将解析结果更新到r.Form字段。
func (r *Request) FormValue(key string) string //FormValue返回key为键查询r.Form字段得到结果[]string切片的第一个值
func (*Request) PostFormValue //PostFormValue返回key为键查询r.PostForm字段得到结果[]string切片的第一个值。注:postform和form的区别是from还
包含了url的查询参数
func (r *Request) FormFile(key string) (multipart.File, *multipart.FileHeader, error) //FormFile返回以key为键查询r.MultipartForm字段得到结果中的第一个文件和它的信息。如果必要,本函数会隐式调用ParseMultipartForm和ParseForm。查询失败会返回ErrMissingFile错误。
reponse的一些方法和属性:
属性:
Status string // 例如"200 OK"
StatusCode int // 例如200
Header Header //响应头
Body io.ReadCloser //响应体
方法:
func (r *Response) Write(w io.Writer) error //将w写入到reponse的相关属性中、如statuscode ,body
func (r *Response) Cookies() []*Cookie //Cookies解析并返回该回复中的Set-Cookie头设置的cookie。
func ReadResponse(r *bufio.Reader, req *Request) (*Response, error) //ReadResponse从r读取并返回一个HTTP 回复。req参数是可选的,指定该回复对应的
请求(即是对该请求的回复)。
func (r *Response) Location() (*url.URL, error) //Location返回该回复的Location头设置的URL。相对地址的重定向会相对于该回复对应的请求来确定绝对地
址。
6. 谈谈cookie和session。
答:由于http协议是无状态的,服务器需要记录用户的状态,所以cookie和session都是用来保持状态的方案,session又依赖cookie。二者的区别主要是
1,session 在服务器端,cookie 在客户端(浏览器)
2,session 默认被存在在服务器的一个文件里(不是内存)
3,session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 session_id)
4,session 可以放在 文件、数据库、或内存中都可以。
5,用户验证这种场合一般会用 session
第三次
这家公司面的是Java,公司不是很大,做外包的,面试官比较年轻,人也不错,了解了一下我的情况,问了下项目直接开始问技术细节问题。
1.maven熟练吗?简单说下maven插件怎么配? maven一般有几种类型,maven根据什么找到配置的jar包?
答:maven还是比较熟悉。eclipse配置maven插件,主要是设置一下maven的全局配置文件,即可根据配置文件自动找到镜像库,一般我们都会设置一个本地仓库。maven仓库分为本地仓库+远程仓库两大类,远程仓库又分为:中央仓库+私服+其它公共远程仓库。任何的依赖都有唯一的坐标,Maven根据这个坐标定义了依赖在仓库中的唯一存储路径。
2.说说springmvc一些常用的注解
答: @controller:表明这是一个controller,能够根据@requestmapping定义的url被外界访问到。
@RequestMapping:是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径,它有六个属性,分别是value,method,consumes,produces,params,headers.
@Autowired: bean的注入时使用,按照类型(byType)装配依赖对象.
@PathVariable: 用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数
@requestParam: 主要用于在SpringMVC后台控制层获取参数,类似一种是request.getParameter("name"),它有三个常用参数:defaultValue = "0", required = false, value = "isApp";defaultValue 表示设置默认值,required 铜过boolean设置是否是必须要传入的参数,value 值表示接受的传入的参数类型。
@ResponseBody: 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_28163175/article/details/73510077
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。