您的位置:首页 > 职场人生

java/golang开发面试中遇到的问题集锦--持续更新

2017-06-20 22:55 627 查看
   博主是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

可以将一个正在前台执行的命令放到后台,并且暂停

参考自Unix或Linux中&、jobs、fg、bg等命令的使用方法

5. 接触过sql优化吗?

   答:一般采取简历索引来加快检索速度。

参考博文:数据库索引实现原理

还有一些问题忘记了,记忆深刻的就这几个。

第二次

这家公司是做旅游行业的,我当时也是面的golang web开发。下面是相关问题:

1.当打开浏览器输入url到打开网页,这当中发生了什么?
 
   这个问题当时还真把我问蒙了,只知道dns要根据域名去查找对应的IP返回,浏览器在访问对应IP的服务器,当时答的也不理想。回来查了一下,竟然是百度的面试题,醉了,总的来说分为下面几个过程。

(1). DNS解析

(2). TCP连接

(3). 发送HTTP请求

(4). 服务器处理请求并返回HTTP报文

(5). 浏览器解析渲染页面

(6). 连接结束

具体细节涉及知识较多太过复杂,这里就不细说了,感兴趣的同学可以参考下面两篇博文

http://fex.baidu.com/blog/2014/05/what-happen/

http://www.cnblogs.com/engeng/articles/5943382.html

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加到请求头中进行使用

详细参考:JSON Web Token - 在Web应用间安全地传递信息

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。相对地址的重定向会相对于该回复对应的请求来确定绝对地
址。


详细参考go官方文档:golang官方中文文档

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

详细参考:cookie和session的区别详解

第三次

这家公司面的是Java,公司不是很大,做外包的,面试官比较年轻,人也不错,了解了一下我的情况,问了下项目直接开始问技术细节问题。

1.maven熟练吗?简单说下maven插件怎么配? maven一般有几种类型,maven根据什么找到配置的jar包?

答:maven还是比较熟悉。eclipse配置maven插件,主要是设置一下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等)使用
          
使用细节请参考:springmvc常用注解
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  面试 golang java