java/golang開發面試中遇到的問題集錦--持續更新

   博主是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。相對地址的重定向會相對於該回復對應的請求來確定絕對地
址。



詳細參考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

第三次

這家公司面的是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常用註解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章