Golang中下劃線(_)的不錯用法分享

1、忽略返回值

這個應該是最簡單的用途,比如某個函數返回三個參數,但是我們隻需要其中的兩個,另外一個參數可以忽略,這樣的話代碼可以這樣寫:

v1, v2, _ := function(...)
v1, _, _ := function(...)

如果沒有產生新變量

_, _, _ = function(...)
_ = json.Unmarshal(...)

2、用在變量(特別是接口斷言)

例如我們定義瞭一個接口(interface):

type Foo interface {
     Say()
}

然後定義瞭一個結構體(struct)

type Dog struct {

​​​​​​​}

然後我們希望在代碼中判斷Dog這個struct是否實現瞭Foo這個interface

var _ Foo = Dog{}

上面用來判斷Dog是否實現瞭Foo, 用作類型斷言,如果Dog沒有實現Foo,則會報編譯錯誤

3、用在import package

假設我們在代碼的import中這樣引入package:

import _ "test/foo"

這表示在執行本段代碼之前會先調用test/foo中的初始化函數(init),這種使用方式僅讓導入的包做初始化,而不使用包中其他功能

例如我們定義瞭一個Foo struct,然後對它進行初始化

package foo
import "fmt"
type Foo struct {
        Id   int
        Name string
}
func init() {
        f := &Foo{Id: 123, Name: "abc"}
        fmt.Printf("init foo object: %v\n", f)
}

然後在main函數裡面引入test/foo

package main
import (
        "fmt"
        _ "test/foo"
)
func main() {
        fmt.Printf("hello world\n")
}

運行結果如下

init foo object: &{123 abc}
hello world

我們可以看到:在main函數輸出”hello world”之前就已經對foo對象進行初始化瞭!

4、版本校驗,編譯時斷言

在使用gRPC的時候,看到通過 const 來做版本校驗,因為他牽涉到多個項目多個包,生成的 pb.go 文件需要指定具體版本信息

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)
// This is a compile-time assertion that a sufficiently up-to-date version
// of the legacy proto package is being used.
const _ = proto.ProtoPackageIsVersion4

常量 proto.ProtoPackageIsVersion4 在業務代碼中不會被調用到,因此無法通過明確調用的方式來迫使編譯器報錯,因此可以再定義個常量來引用它

const _ = proto.ProtoPackageIsVersion4

或者

const vs4 = proto.ProtoPackageIsVersion4

比如,有些版本並未發生大的改動,無論是編譯還是運行都不會有影響,但是運行結果不同,因此需要顯示的做版本限制。

到此這篇關於Golang中下劃線(_)的不錯用法分享的文章就介紹到這瞭,更多相關Golang下劃線內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: