最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

go程序中同一個(gè)包下為什么會(huì)存在多個(gè)同名的函數(shù)或變量(詳細(xì)解析)

 更新時(shí)間:2024年05月21日 10:56:12   作者:ProblemTerminator  
這篇文章主要介紹了go程序中同一個(gè)包下為什么會(huì)存在多個(gè)同名的函數(shù)或變量(詳細(xì)解析),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

背景

首先,這種情況顯然是不符合編譯規(guī)則的,我們都知道在同一個(gè)包下出現(xiàn)兩個(gè)同名的函數(shù)、變量、常量等會(huì)編譯不通過,那么怎么還會(huì)有這種現(xiàn)象存在?

如下,源碼中任意找一個(gè)有這種現(xiàn)象的包:

一探究竟

既然都是go代碼,肯定是適配同一套邏輯的。

創(chuàng)建一個(gè)測(cè)試項(xiàng)目,創(chuàng)建一個(gè)包pkg,分別創(chuàng)建如下文件:

我們讓mypkg包下的所有文件中都有GetPackageName函數(shù)(返回的值不同)、flag變量。

注意,這些文件目前并未提示redeclared。

然后main中調(diào)用GetPackageName函數(shù)。

在運(yùn)行之前,編譯器并沒有顯式的報(bào)錯(cuò)。接著go build,編譯正常。運(yùn)行結(jié)果輸出了:

mypkg from windows

交叉編譯一下Linux平臺(tái),運(yùn)行:

mypkg from linux

看起來編譯時(shí)自動(dòng)找到對(duì)應(yīng)文件處理了。

繼續(xù)。

在mypkg包下接著新建一個(gè)名為openbsd.go的文件,和上述文件的函數(shù)保持同名,然后很明顯的報(bào)錯(cuò)出來了:'GetPackageName' redeclared in this package

條件不變,且在pkg_windows.go文件已存在的前提下:

繼續(xù)創(chuàng)建名為_openbsd.go的文件,沒有報(bào)錯(cuò)。

繼續(xù)創(chuàng)建名為pkg_amd64.go、pkg_x64.go、pkg_x86.go、othername_amd64.go等文件均會(huì)提示redeclared。

但創(chuàng)建的othername_arm64.go、pkg_linux_amd64.go、pkg_linux_arm64.go不會(huì)提示。

對(duì)于linux的兩個(gè)文件,這里看著沒毛病,實(shí)際上在linux、amd64平臺(tái)上編譯就會(huì)報(bào)錯(cuò):

mypkg\pkg_linux_amd64.go:4:2: flag redeclared in this block
        mypkg\pkg_linux.go:4:2: other declaration of flag 
mypkg\pkg_linux_amd64.go:7:6: GetPackageName redeclared in this block
        mypkg\pkg_linux.go:7:6: other declaration of GetPackageName

是因?yàn)閜kg_linux_amd64.go文件和pkg_linux.go文件的同名內(nèi)容沖突了,在linux、amd64平臺(tái)上編譯,這兩文件就會(huì)被適配到。

如果目標(biāo)平臺(tái)改為linux、arm64進(jìn)行編譯,也會(huì)報(bào):

mypkg\pkg_arm64.go:4:2: flag redeclared in this block
        mypkg\othername_arm64.go:4:2: other declaration of flag
mypkg\pkg_arm64.go:7:6: GetPackageName redeclared in this block
        mypkg\othername_arm64.go:7:6: other declaration of GetPackageName
mypkg\pkg_linux.go:4:2: flag redeclared in this block
        mypkg\othername_arm64.go:4:2: other declaration of flag
mypkg\pkg_linux.go:7:6: GetPackageName redeclared in this block
        mypkg\othername_arm64.go:7:6: other declaration of GetPackageName

是因?yàn)閛thername_arm64.go文件、pkg_arm64.go和pkg_linux.go文件的同名內(nèi)容沖突了,在linux、arm64平臺(tái)上編譯,這三個(gè)文件就會(huì)被適配到。

綜合來看:

1,類似約定xxx_windows.go、xxx_arm64.go、xxx_linux_arm64.go命名的文件用于實(shí)現(xiàn)平臺(tái)特定的代碼。

2,編譯器自動(dòng)認(rèn)識(shí)以_系統(tǒng)/arch名稱結(jié)尾的go文件。

3,編譯時(shí),GOOS 和 GOARCH都可以在文件名上來做構(gòu)建約束,go編譯器會(huì)根據(jù)當(dāng)前操作系統(tǒng)自動(dòng)選擇匹配的文件進(jìn)行編譯。

增加構(gòu)建約束 & 不同格式的構(gòu)建約束

例如,針對(duì)不同的系統(tǒng)、架構(gòu)的代碼文件做相同的事情,我們可以進(jìn)行編譯約束:

即,頂部增加如下格式的約束(不能漏掉注釋):

//go:build arm64 && freebsd

如下格式僅針對(duì)特定操作系統(tǒng):

//go:build freebsd

如下格式針對(duì)特定的多個(gè)系統(tǒng)均可:

//go:build aix || darwin || freebsd || linux

如下格式的文件支持在linux系統(tǒng)、但不能在arm或arm64架構(gòu)下進(jìn)行編譯

//go:build linux && !arm && !arm64

感嘆號(hào)表示“非”。

以上是go 1.17及以上版本引入的格式,定義了一個(gè)布爾表達(dá)式,包含了邏輯運(yùn)算符,條件可以更復(fù)雜。

與此不同,下面的格式是go 1.17以下支持的約束格式:

// +build freebsd

也會(huì)有兩種格式并存的情況:

//go:build linux
// +build linux

因?yàn)橐灿协h(huán)境是老編譯器的情況,老版本的編譯器不能識(shí)別新的約束語法。

go語言支持的系統(tǒng)和架構(gòu)列表

#go tool dist list
aix/ppc64
android/386
android/amd64
android/arm
android/arm64
darwin/amd64
darwin/arm64
dragonfly/amd64
freebsd/386
freebsd/amd64
freebsd/arm
freebsd/arm64
freebsd/riscv64
illumos/amd64
ios/amd64
ios/arm64
js/wasm
linux/386
linux/amd64
linux/arm
linux/arm64
linux/loong64
linux/mips
linux/mips64
linux/mips64le
linux/mipsle
linux/ppc64
linux/ppc64le
linux/riscv64
linux/s390x
netbsd/386
netbsd/amd64
netbsd/arm
netbsd/arm64
openbsd/386
openbsd/amd64
openbsd/arm
openbsd/arm64
openbsd/ppc64
plan9/386
plan9/amd64
plan9/arm
solaris/amd64
wasip1/wasm
windows/386
windows/amd64
windows/arm
windows/arm64

到此這篇關(guān)于go程序中同一個(gè)包下為什么會(huì)存在多個(gè)同名的函數(shù)或變量的文章就介紹到這了,更多相關(guān)go程序同一個(gè)包存在多個(gè)同名的函數(shù)或變量?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go處理json數(shù)據(jù)方法詳解(Marshal,UnMarshal)

    Go處理json數(shù)據(jù)方法詳解(Marshal,UnMarshal)

    這篇文章主要介紹了Go處理json數(shù)據(jù)的方法詳解,Marshal(),UnMarshal(),需要的朋友可以參考下
    2022-04-04
  • 詳解golang RWMutex讀寫互斥鎖源碼分析

    詳解golang RWMutex讀寫互斥鎖源碼分析

    這篇文章主要介紹了詳解golang RWMutex讀寫互斥鎖源碼分析,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • GO語言embed機(jī)制的使用

    GO語言embed機(jī)制的使用

    本文詳細(xì)介紹了Go語言中使用embed機(jī)制將靜態(tài)文件(如圖片、文本和目錄)嵌入到程序中,包括文件轉(zhuǎn)[]byte、string類型,以及使用FS結(jié)構(gòu)組合多個(gè)文件和目錄的方法,下面就來詳細(xì)的介紹一下
    2026-03-03
  • Golang實(shí)現(xiàn)短網(wǎng)址/短鏈服務(wù)的開發(fā)筆記分享

    Golang實(shí)現(xiàn)短網(wǎng)址/短鏈服務(wù)的開發(fā)筆記分享

    這篇文章主要為大家詳細(xì)介紹了如何使用Golang實(shí)現(xiàn)短網(wǎng)址/短鏈服務(wù),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下
    2023-05-05
  • Go操作etcd的實(shí)現(xiàn)示例

    Go操作etcd的實(shí)現(xiàn)示例

    etcd是近幾年比較火熱的一個(gè)開源的、分布式的鍵值對(duì)數(shù)據(jù)存儲(chǔ)系統(tǒng),提供共享配置、服務(wù)的注冊(cè)和發(fā)現(xiàn),本文主要介紹etcd的安裝和使用,感興趣的可以了解一下
    2021-09-09
  • Go語言基礎(chǔ)知識(shí)總結(jié)(語法、變量、數(shù)值類型、表達(dá)式、控制結(jié)構(gòu)等)

    Go語言基礎(chǔ)知識(shí)總結(jié)(語法、變量、數(shù)值類型、表達(dá)式、控制結(jié)構(gòu)等)

    這篇文章主要介紹了Go語言基礎(chǔ)知識(shí)總結(jié)(語法、變量、數(shù)值類型、表達(dá)式、控制結(jié)構(gòu)等),本文匯總了Go語言的入門知識(shí),需要的朋友可以參考下
    2014-10-10
  • 詳解如何在Go中實(shí)現(xiàn)優(yōu)雅停止

    詳解如何在Go中實(shí)現(xiàn)優(yōu)雅停止

    和其他語言相比,Go 中有相同也有不同,相同的是實(shí)現(xiàn)思路上和其他語言沒啥差異,不同在于 Go 采用的是 goroutine + channel 的并發(fā)模型,與傳統(tǒng)的進(jìn)程線程相比,實(shí)現(xiàn)細(xì)節(jié)上存在差異,本文將從實(shí)際場(chǎng)景和它的一般實(shí)現(xiàn)方式展開,逐步討論這個(gè)話題,需要的朋友可以參考下
    2024-04-04
  • go語言接口之接口值舉例詳解

    go語言接口之接口值舉例詳解

    接口是一種抽象類型,是對(duì)其他類型行為的概括與抽象,從語法角度來看,接口是一組方法定義的集合,下面這篇文章主要給大家介紹了關(guān)于go語言接口之接口值的相關(guān)資料,文章通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-06-06
  • golang并發(fā)鎖使用詳解

    golang并發(fā)鎖使用詳解

    這篇文章主要介紹了golang并發(fā)鎖使用詳解的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • go?build失敗報(bào)方法undefined的解決過程

    go?build失敗報(bào)方法undefined的解決過程

    go build命令用于編譯我們指定的源碼文件或代碼包以及它們的依賴包,下面這篇文章主要給大家介紹了關(guān)于go?build失敗報(bào)方法undefined的解決過程,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11

最新評(píng)論

肇州县| 博兴县| 通城县| 琼中| 嘉兴市| 宜章县| 育儿| 莫力| 宽城| 揭阳市| 德化县| 洪江市| 改则县| 南雄市| 扶绥县| 大关县| 横峰县| 湟源县| 福海县| 邻水| 花莲市| 太康县| 青田县| 天门市| 镶黄旗| 长子县| 淮南市| 扶风县| 阿坝县| 勃利县| 左贡县| 石泉县| 密云县| 淮南市| 兴业县| 洞口县| 双峰县| 万年县| 钦州市| 大姚县| 密云县|