java/golang開發面試中遇到的問題集錦--持續更新
阿新 • • 發佈:2019-01-05
博主是2017屆的應屆生,主要掌握的語言是java,後面在實習的時候,自學了golang,期間也是做了一些小東西,實習結束後,開始投入到找工作的大流中,所以想把面試中遇到的各種問題記錄起來方便學習,同時也希望能對其他找工作的同學有點幫助吧,有些問題是經過查資料整理的,感謝提供答案的大家。好了,廢話不多說,我們下面開始。文筆不好,望諒解。
第一次
這家公司是做遊戲的,我當時面的golang開發,下面是hr問的技術相關的問題。 1.go語言有些什麼特點? 答:編譯型語言,部署簡單,併發性好,自動垃圾回收,完善簡便的各種類庫,適用於大規模高併發後端伺服器程式開發 2.如何清空mysql表中的所有資料? 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
可以將一個正在前臺執行的命令放到後臺,並且暫停
第二次
這家公司是做旅遊行業的,我當時也是面的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