Golang中下劃線(_)的不錯(cuò)用法分享
1、忽略返回值
這個(gè)應(yīng)該是最簡(jiǎn)單的用途,比如某個(gè)函數(shù)返回三個(gè)參數(shù),但是我們只需要其中的兩個(gè),另外一個(gè)參數(shù)可以忽略,這樣的話代碼可以這樣寫:
v1, v2, _ := function(...) v1, _, _ := function(...)
如果沒有產(chǎn)生新變量
_, _, _ = function(...) _ = json.Unmarshal(...)
2、用在變量(特別是接口斷言)
例如我們定義了一個(gè)接口(interface):
type Foo interface { Say() }
然后定義了一個(gè)結(jié)構(gòu)體(struct)
type Dog struct { ???????}
然后我們希望在代碼中判斷Dog這個(gè)struct是否實(shí)現(xiàn)了Foo這個(gè)interface
var _ Foo = Dog{}
上面用來(lái)判斷Dog是否實(shí)現(xiàn)了Foo, 用作類型斷言,如果Dog沒有實(shí)現(xiàn)Foo,則會(huì)報(bào)編譯錯(cuò)誤
3、用在import package
假設(shè)我們?cè)诖a的import中這樣引入package:
import _ "test/foo"
這表示在執(zhí)行本段代碼之前會(huì)先調(diào)用test/foo中的初始化函數(shù)(init),這種使用方式僅讓導(dǎo)入的包做初始化,而不使用包中其他功能
例如我們定義了一個(gè)Foo struct,然后對(duì)它進(jìn)行初始化
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函數(shù)里面引入test/foo
package main import ( "fmt" _ "test/foo" ) func main() { fmt.Printf("hello world\n") }
運(yùn)行結(jié)果如下
init foo object: &{123 abc}
hello world
我們可以看到:在main函數(shù)輸出”hello world”之前就已經(jīng)對(duì)foo對(duì)象進(jìn)行初始化了!
4、版本校驗(yàn),編譯時(shí)斷言
在使用gRPC的時(shí)候,看到通過(guò) const 來(lái)做版本校驗(yàn),因?yàn)樗麪可娴蕉鄠€(gè)項(xiàng)目多個(gè)包,生成的 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 在業(yè)務(wù)代碼中不會(huì)被調(diào)用到,因此無(wú)法通過(guò)明確調(diào)用的方式來(lái)迫使編譯器報(bào)錯(cuò),因此可以再定義個(gè)常量來(lái)引用它
const _ = proto.ProtoPackageIsVersion4
或者
const vs4 = proto.ProtoPackageIsVersion4
比如,有些版本并未發(fā)生大的改動(dòng),無(wú)論是編譯還是運(yùn)行都不會(huì)有影響,但是運(yùn)行結(jié)果不同,因此需要顯示的做版本限制。
到此這篇關(guān)于Golang中下劃線(_)的不錯(cuò)用法分享的文章就介紹到這了,更多相關(guān)Golang下劃線內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Goland激活碼破解永久版及安裝詳細(xì)教程(親測(cè)可以)
這篇文章主要介紹了Goland激活碼破解永久版及安裝詳細(xì)教程(親測(cè)可以),本文通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10Go語(yǔ)言實(shí)現(xiàn)動(dòng)態(tài)開點(diǎn)線段樹詳解
線段樹是一種用于高效處理區(qū)間查詢和區(qū)間更新的數(shù)據(jù)結(jié)構(gòu),下面我們就來(lái)看看如何使用Go實(shí)現(xiàn)動(dòng)態(tài)開點(diǎn)線段樹的方式,感興趣的可以了解下2025-02-02golang中defer執(zhí)行時(shí)機(jī)的案例分析
這篇文章主要來(lái)通過(guò)一些案例和大家一起探討一下golang中defer的執(zhí)行時(shí)機(jī),文中的示例代碼講解詳細(xì),對(duì)我們深入了解golang有一定的幫助,感興趣的可以跟隨小編一起學(xué)習(xí)一下2023-11-11淺談beego默認(rèn)處理靜態(tài)文件性能低下的問(wèn)題
下面小編就為大家?guī)?lái)一篇淺談beego默認(rèn)處理靜態(tài)文件性能低下的問(wèn)題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06Windows下使用go語(yǔ)言寫程序安裝配置實(shí)例
這篇文章主要介紹了Windows下使用go語(yǔ)言寫程序安裝配置實(shí)例,本文講解了安裝go語(yǔ)言、寫go代碼、生成可執(zhí)行文件、批量生成可執(zhí)行文件等內(nèi)容,需要的朋友可以參考下2015-03-03intelliJ?idea安裝go開發(fā)環(huán)境并搭建go項(xiàng)目(打包)全過(guò)程
最近在配置idea開發(fā)go語(yǔ)言時(shí)碰到很多問(wèn)題,所以這里給大家總結(jié)下,這篇文章主要給大家介紹了關(guān)于intelliJ?idea安裝go開發(fā)環(huán)境并搭建go項(xiàng)目(打包)的相關(guān)資料,需要的朋友可以參考下2023-10-10