1. 程式人生 > >java/golang開發面試中遇到的問題集錦--持續更新

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