iT邦幫忙

2023 iThome 鐵人賽

DAY 8
0

博愛座可能是為了那些需要額外空間或特殊照顧的人而設計,他不總是被使用。但在你需要時,可以坐下。

The blank identifier

我們可以將其想像成一個在程式中的佔位符號,一個我們可以使用來忽略或放置不需要的數值或變數的工具。當我們遇到需要處理多個變數或值的情況,但不需要全部都使用到時可以使用。

The blank identifier in multiple assignment

_ 用來表示一個變數的值將被消失或者不使用。
舉例:
在這邊使用 _忽略變數 b 的值,因為我們最後不會使用到它。

package main

import "fmt"

func main() {
    a, b := 10, 20
    _, c := 30, 40

    fmt.Println("a:", a)
    fmt.Println("c:", c)
}

來看一下,這邊會輸出什麼東西?為什麼呢?

./main.go:6:5: b declared but not used

因為 Go 語言有個特性,當宣告一個變數卻不使用時,編譯器會認為這是一個潛在的錯誤,目的是 避免不必要的宣告。(後面會說 : Unused variables

那什麼時候會使用到 _ 呢?
使用多重賦值,但只關心座位類型,其他信息使用空白識別符號 _ 忽略

package main

import "fmt"

func getSpecialSeatInfo() (string, int, bool) {
	// 假設這個函數返回了三個值
	seatType := "博愛座"
	seatNumber := 10
	isOccupied := true
	return seatType, seatNumber, isOccupied
}

func main() {
	seatType, _, _ := getSpecialSeatInfo()

	fmt.Printf("這個座位的類型是:%s\n", seatType)
}

這個座位的類型是:博愛座

Unused imports and variables

是指在程式碼中引入了一個套件或者宣告了一個變數,但卻從未在後續的程式碼中使用它們。

Unused imports

當你在程式碼中 引入一個套件 ,但後續的程式碼中卻 沒有使用 這個套件中的任何功能時,就會產生 未使用的引入 。(但如果你有安裝Extension,它會檢查後自動刪減)
舉裡:

package main

import "fmt"

func main() {
    // 這裡沒有使用 fmt 套件中的任何功能
}

Unused variables

當你 宣告 一個變數,但後續的程式碼中卻 沒有使用 這個變數時,就會產生 未使用的變數 也就是上面程式碼出現的 declared but not used

Import for side effect

引入一個套件,並且 不直接使用 該套件的任何函數、變數或類型,而僅僅是 為了觸發套件中初始化 操作或 副作用
可以是引入自己的根目錄檔案:引入資料庫初始化的檔案,但未使用它的功能

// main.go
package main

import (
    "fmt"
    _ "yourapp/database" 
)

func main() {
    fmt.Println("main go")
}

也可以是引入第三方的初始化:

package handlers

import (
	_ "github.com/joho/godotenv/autoload"
)

Interface checks

檢查一個 是否回傳了某個 interface 的所有方法。

舉例:
博愛座 上的標記並不指明具體是哪一類特殊需求的人可以使用它們。表示不論是一位孕婦、長輩還是行動不便的乘客,只要 符合 這些 特殊需求 之一,都 可以使用 這些座位,而不需要特別知道是哪一種特殊需求

package main

import "fmt"

// 定義一個特殊需求的介面
type SpecialNeeds interface {
	PrioritySeat() string
}

// 實現不同特殊需求的類型
type Pregnant struct{}

func (p Pregnant) PrioritySeat() string {
	return "提供給孕婦有需要時使用"
}

type Elderly struct{}

func (e Elderly) PrioritySeat() string {
	return "提供長輩有需要時使用"
}

type Disabled struct{}

func (d Disabled) PrioritySeat() string {
	return "提供行動不便者有需要時使用"
}

type WithChild struct{}

func (w WithChild) PrioritySeat() string {
	return "提供給抱小孩的人有需要時使用"
}

func main() {
	// 不同的乘客可以使用相同的特殊需求介面
	passengers := []SpecialNeeds{
		Pregnant{},
		Elderly{},
		Disabled{},
		WithChild{},
	}

	// 檢查並提供特殊協助
	for _, passenger := range passengers {
		fmt.Println(passenger.PrioritySeat())
	}
}

提供給孕婦有需要時使用
提供長輩有需要時使用
提供行動不便者有需要時使用
提供給抱小孩的人有需要時使用

碎語

跟一下時事 XD
沒想到博愛座用來解釋 _ 意外的好舉例。

在 Golang 中,空白識別符號 就像是 博愛座,它們允許我們忽略或不需要的值,專注於我們 真正需要 的部分。
就像 博愛座 對所有 有特殊需求的人開放 一樣。


上一篇
07 | 歡迎來到Platform 9¾
下一篇
09 | 正衣冠、知興替、明得失
系列文
Go 語言學習手札30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言