Go 面試題一(基礎語法)
來源:geektutu
01 = 和 := 的差別?
=:賦值給「已定義」的變數。:=:宣告並賦值,會在當前作用域中「定義新變數」。
var a int
a = 1 // 使用 = 給已存在變數賦值
b := 2 // 使用 := 定義並賦值新變數
02 指標(pointer)的作用
指標是「存放變數記憶體位址」的變數。在 32 / 64 位系統上,指標本身分別固定佔用 4 / 8 個位元組。
主要用途:
- 獲取變數的值(透過解參考)
- 修改外部變數的值(模擬「傳址呼叫」)
- 作為方法接收器,避免大量拷貝,並可修改接收者狀態
package main
import "fmt"
func main() {
a := 1
p := &a // 取址:&
fmt.Printf("%d\n", *p) // 取值:*
}
指標用於修改外部變數:
// 交換函式
func swap(a, b *int) {
*a, *b = *b, *a
}
指標作為方法接收器:
type A struct{}
func (a *A) Fun() {
// ...
}
03 Go 允許多個回傳值嗎?
允許。Go 函式可以回傳多個值,常見模式是「回傳結果 + error」:
func doSomething() (int, error) {
// ...
return 0, nil
}
04 Go 有「異常」型別嗎?
Go 沒有傳統 try...catch,而是以 error 介面搭配顯式錯誤處理。
val, err := funcDemo()
if err != nil {
fmt.Println(err)
return
}
可以使用 errors.New 建立自訂錯誤,只要實作 Error() string 方法即可:
type errorString struct {
s string
}
func (e *errorString) Error() string {
return e.s
}
// 建構函式
func New(text string) error {
return &errorString{text}
}
05 什麼是協程(Goroutine)?
Goroutine 是使用者態的輕量級執行緒,是 Go 調度的基本單位。
- 透過在函式前加上
go關鍵字啟動:
go someFunc()
- Goroutine 以非常小的堆疊(例如 2KB 或 4KB)啟動,並會隨需求自動伸縮。
- 可輕易同時啟動數十萬個 Goroutine。
06 如何高效地拼接字串?
07 什麼是 rune 型別?
- ASCII:只需 7 bit,能表示 128 個字元(主要為英文)。
- Unicode:為世界各種文字系統定義統一編碼,每個字元稱為一個「碼點(Code Point)」。
- Go 中的
rune是int32的別名,用來表示一個 Unicode 碼點。
Go 字串的底層是 []byte(8 bit),不是 []rune。
sample := "我愛GO"
runeSamp := []rune(sample)
runeSamp[0] = '你'
fmt.Println(string(runeSamp)) // "你愛GO"
fmt.Println(len(runeSamp)) // 4
08 如何判斷 map 中是否包含某個 key?
使用「逗號 ok」寫法:
var sample map[int]int
if _, ok := sample[10]; ok {
// key 10 存在
} else {
// key 10 不存在
}