Go 面試題



尊敬的讀者,這些 **Go 程式語言面試題** 是專門設計的,旨在讓您熟悉在 **Go 程式語言** 面試中可能遇到的題型。根據我的經驗,優秀的 interviewers 很少會預先計劃好要問哪些具體問題,通常問題會從該主題的一些基本概念開始,然後根據進一步的討論以及您的回答繼續下去。

Go 是一種通用的程式語言,其設計理念是面向系統程式設計。它最初由 Robert Griesemer、Rob Pike 和 Ken Thompson 於 2007 年在 Google 開發。它是一種強型別且靜態型別的語言,提供內建的垃圾回收支援,並支援併發程式設計。程式使用包構建,以便高效地管理依賴項。Go 程式設計實現使用傳統的編譯和連結模型來生成可執行二進位制檔案。

以下是使用 Go 程式設計的好處:

  • 支援類似於動態語言的環境採用模式。例如,型別推斷(x := 0 是 int 型別變數 x 的有效宣告)。

  • 編譯速度快。

  • 內建併發支援:輕量級程序(透過 goroutines)、通道、select 語句。

  • 簡潔、簡單和安全。

  • 支援介面和型別嵌入。

  • 生成無需外部依賴項的靜態連結本地二進位制檔案。

不支援型別繼承。

不支援運算子過載。

不支援方法過載。

不支援指標運算。

不支援泛型程式設計。

是的!Go 是一種區分大小寫的程式語言。

靜態型別變數宣告向編譯器保證存在一個具有給定型別和名稱的變數,以便編譯器無需瞭解變數的完整細節即可繼續編譯。變數宣告只在編譯時才有意義,編譯器在程式連結時需要實際的變數宣告。

動態型別變數宣告需要編譯器根據傳遞給它的值來解釋變數的型別。編譯器不需要變數在靜態上具有型別作為必要條件。

是的,可以使用型別推斷一次宣告不同型別的變數。

var a, b, c = 3, 4, "foo"  

以下程式碼列印變數的型別:

var a, b, c = 3, 4, "foo"  
fmt.Printf("a is of type %T\n", a)

它是一個指標變數,可以儲存變數的地址。

例如:

var x = 5
var p *int
p = &x
fmt.Printf("x = %d", *p)

這裡 x 可以透過 *p 訪問。

break 終止 for 迴圈或 switch 語句,並將執行轉移到 for 迴圈或 switch 語句之後緊跟的語句。

continue 使迴圈跳過其主體的其餘部分,並在重新迭代之前立即重新測試其條件。

goto 將控制轉移到帶標籤的語句。

Go 程式語言中 for 迴圈的語法如下:

for [condition |  ( init; condition; increment ) | Range] {
   statement(s);
}

以下是 for 迴圈中的控制流程:

  • 如果存在條件,則 for 迴圈在條件為真時執行。

  • 如果存在 for 子句(init; condition; increment),則

    首先執行 init 步驟,並且只執行一次。此步驟允許您宣告和初始化任何迴圈控制變數。只要出現分號,您就無需在此處放置語句。

    接下來,評估條件。如果為真,則執行迴圈體。如果為假,則不執行迴圈體,控制流跳轉到 for 迴圈之後的下一條語句。

    執行 for 迴圈體後,控制流跳轉回 increment 語句。此語句允許您更新任何迴圈控制變數。只要條件後出現分號,此語句就可以留空。

    現在再次評估條件。如果為真,則執行迴圈並重復此過程(迴圈體,然後是 increment 步驟,然後再次是條件)。條件變為假後,for 迴圈終止。

  • 如果存在範圍,則 for 迴圈將為範圍中的每個專案執行。

Go 程式語言中函式定義的通用形式如下:

func function_name( [parameter list] ) [return_types] {
   body of the function
}

Go 程式語言中的函式定義由 *函式頭* 和 *函式體* 組成。以下是函式的所有部分:

  • **func** func 開始函式的宣告。

  • **函式名稱** - 這是函式的實際名稱。函式名稱和引數列表一起構成函式簽名。

  • **引數** - 引數就像佔位符。呼叫函式時,您將值傳遞給引數。此值稱為實際引數或自變數。引數列表是指函式的引數的型別、順序和數量。引數是可選的;也就是說,函式可能不包含引數。

  • **返回型別** - 函式可以返回多個值。**return_types** 是函式返回的值的資料型別的列表。某些函式執行所需的運算而不返回值。在這種情況下,不需要 return_type。

  • **函式體** - 函式體包含定義函式功能的語句集合。

Go 函式可以返回多個值。例如:

package main
import "fmt"

func swap(x, y string) (string, string) {
   return y, x
}
func main() {
   a, b := swap("Mahesh", "Kumar")
   fmt.Println(a, b)
}

呼叫函式時,引數傳遞給函式有兩種方法:

  • **按值呼叫** - 此方法將引數的實際值複製到函式的形式引數中。在這種情況下,對函式內部引數所做的更改不會影響自變數。

  • **按引用呼叫** - 此方法將引數的地址複製到形式引數中。在函式內部,該地址用於訪問呼叫中使用的實際引數。這意味著對引數所做的更改會影響自變數。

預設情況下,Go 使用按值呼叫來傳遞引數。通常,這意味著函式內的程式碼無法更改用於呼叫函式的自變數,以及上面提到的呼叫 max() 函式時使用的相同方法。

Go 程式語言提供靈活的功能,可以動態建立函式並將其用作值。我們可以使用函式定義設定變數,並將其用作函式的引數。

函式閉包是匿名函式,可用於動態程式設計。

Go 程式語言支援稱為方法的特殊型別的函式。在方法宣告語法中,存在一個“接收器”來表示函式的容器。可以使用“.”運算子使用此接收器來呼叫函式。

區域性變數的預設值與其對應的 0 值相同。

全域性變數的預設值與其對應的 0 值相同。

指標初始化為 nil。

列印格式化的輸出。

賦值運算子右側出現的表示式稱為右值。右值賦值給左值,左值出現在賦值運算子的左側。左值應指定給變數而不是常量。

在呼叫端傳送給函式的引數稱為實際引數,而在函式定義的接收端稱為形式引數。

宣告將型別與變數關聯,而定義為變數提供值。

將程式劃分為子程式(模組/函式)以實現給定任務是模組化方法。更通用的函式定義提供了重用函式的能力,例如內建庫函式。

Go 程式由各種令牌組成,令牌是關鍵字、識別符號、常量、字串文字或符號。

goto

陣列是在一個公共名稱下收集的相似資料項的集合。

如果未分配確切的地址,Go 編譯器會為指標變數分配 Nil 值。這是在變數宣告時完成的。分配了 nil 的指標稱為空指標。空指標是一個常量,其值為零,在多個標準庫中定義。

它是一個指標變數,可以儲存另一個指標變數的地址。它取消引用兩次以指向指定的指標變數儲存的資料。

var a int
var ptr *int
var pptr **int
a = 3000
ptr = &a
pptr = &ptr
fmt.Printf("Value available at **pptr = %d\n", **pptr)

因此 'a' 可以透過 **pptr 訪問。

結構體是 Go 程式語言中另一種使用者定義的資料型別,它允許您組合不同型別的資料項。

要定義結構體,必須使用 `type` 和 `struct` 語句。`struct` 語句定義了一種新的資料型別,它包含多個成員。`type` 語句將一個名稱繫結到該結構體型別。

`struct` 語句的格式如下:

type struct_variable_type struct {
   member definition;
   member definition;
   ...
   member definition;
}

Go 切片是對 Go 陣列的抽象。Go 陣列允許你定義可以容納多個相同型別資料項的變數,但是它沒有提供任何內建方法來動態增加大小或獲取其自身的子陣列。切片彌補了這個限制。它提供了陣列所需的大多數實用函式,並且廣泛用於 Go 程式設計。

要定義切片,你可以像宣告陣列一樣宣告它,無需指定大小,或者使用 `make` 函式建立一個。

var numbers []int /* a slice of unspecified size */
/* numbers == []int{0,0,0,0,0}*/
numbers = make([]int,5,5) /* a slice of length 5 and capacity 5*/

`len()` 函式返回切片中存在的元素個數。

`len()` 函式返回切片中存在的元素個數,而 `cap()` 函式返回切片的容量,即它可以容納的元素個數。

切片允許指定下界和上界,使用 `[下界:上界]` 獲取其子切片。

`range` 關鍵字用於 `for` 迴圈中,迭代陣列、切片、通道或對映的專案。對於陣列和切片,它返回專案的索引(整數)。對於對映,它返回下一個鍵值對的鍵。

Go 提供了另一種重要的資料型別——對映,它將唯一的鍵對映到值。鍵是你用來稍後檢索值的專案。給定一個鍵和一個值,你可以將該值儲存在對映物件中。值儲存後,你可以使用其鍵檢索它。

必須使用 `make` 函式來建立對映。

/* declare a variable, by default map will be nil*/
var map_variable map[key_data_type]value_data_type

/* define the map as nil map can not be assigned any value*/
map_variable = make(map[key_data_type]value_data_type)

`delete()` 函式用於從對映中刪除一個條目。它需要對映和要刪除的相應鍵。

型別轉換是一種將變數從一種資料型別轉換為另一種資料型別的方法。例如,如果你想將一個長整型值儲存到一個簡單的整型中,你可以將長整型型別轉換為整型。你可以使用如下所示的強制型別轉換運算子將值從一種型別轉換為另一種型別:

type_name(expression)

Go 程式設計提供了一種稱為介面的資料型別,它表示一組方法簽名。結構體資料型別實現這些介面以擁有介面方法簽名的定義。

接下來是什麼?

接下來你可以回顧一下你之前完成的與該主題相關的作業,確保你能自信地談論它們。如果你剛畢業,面試官不會期望你回答非常複雜的問題,而是要確保你的基礎知識非常紮實。

其次,如果你無法回答一些問題,其實並不重要,重要的是你回答的任何問題都必須充滿信心。所以在面試中要充滿自信。Tutorialspoint 祝你面試順利,並祝你未來一切順利!乾杯 :-)

go_questions_answers.htm
廣告
© . All rights reserved.