亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

背景

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

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

一探究竟

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

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

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

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

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

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

mypkg from windows

交叉編譯一下Linux平臺,運行:

mypkg from linux

看起來編譯時自動找到對應文件處理了。

繼續(xù)。

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

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

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

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

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

對于linux的兩個文件,這里看著沒毛病,實際上在linux、amd64平臺上編譯就會報錯:

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

是因為pkg_linux_amd64.go文件和pkg_linux.go文件的同名內(nèi)容沖突了,在linux、amd64平臺上編譯,這兩文件就會被適配到。

如果目標平臺改為linux、arm64進行編譯,也會報:

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

是因為othername_arm64.go文件、pkg_arm64.go和pkg_linux.go文件的同名內(nèi)容沖突了,在linux、arm64平臺上編譯,這三個文件就會被適配到。

綜合來看:

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

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

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

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

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

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

//go:build arm64 && freebsd

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

//go:build freebsd

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

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

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

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

感嘆號表示“非”。

以上是go 1.17及以上版本引入的格式,定義了一個布爾表達式,包含了邏輯運算符,條件可以更復雜。

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

// +build freebsd

也會有兩種格式并存的情況:

//go:build linux
// +build linux

因為也有環(huán)境是老編譯器的情況,老版本的編譯器不能識別新的約束語法。

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

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

相關文章

  • 詳解Golang中g(shù)cache模塊的基本使用

    詳解Golang中g(shù)cache模塊的基本使用

    這篇文章主要通過結(jié)合商業(yè)項目的使用場景,為大家介紹了gcache的基本使用、緩存控制以及淘汰策略。使用gcache做緩存處理,簡單方便易上手
    2022-11-11
  • golang移除數(shù)組中重復的元素操作

    golang移除數(shù)組中重復的元素操作

    這篇文章主要介紹了golang移除數(shù)組中重復的元素操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 詳解golang開發(fā)中http請求redirect的問題

    詳解golang開發(fā)中http請求redirect的問題

    這篇文章主要介紹了詳解golang開發(fā)中http請求redirect的問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • golang如何使用gomobile進行Android開發(fā)

    golang如何使用gomobile進行Android開發(fā)

    golang可以開發(fā)android,使用golang開發(fā)android需要下載安裝gomobile,下面這篇文章主要給大家介紹了關于golang如何使用gomobile進行Android開發(fā)的相關資料,需要的朋友可以參考下
    2023-01-01
  • Go語言普通指針unsafe.Pointer?uintpt之間的關系及指針運算

    Go語言普通指針unsafe.Pointer?uintpt之間的關系及指針運算

    這篇文章主要為大家介紹了Go語言普通指針unsafe.Pointer?uintpt之間的關系及指針運算示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • GOPROXY:解決go get golang.org/x包失敗問題

    GOPROXY:解決go get golang.org/x包失敗問題

    這篇文章主要介紹了GOPROXY:解決go get golang.org/x包失敗問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Go語言中sync.Cond使用詳解

    Go語言中sync.Cond使用詳解

    本文主要介紹了Go語言中sync.Cond使用詳解,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Go語言指針使用分析與講解

    Go語言指針使用分析與講解

    這篇文章主要介紹了Go語言指針使用分析與講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Go語言使用Gob傳輸數(shù)據(jù)

    Go語言使用Gob傳輸數(shù)據(jù)

    本文主要介紹了Go語言使用Gob傳輸數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • Golang sync.Map原理深入分析講解

    Golang sync.Map原理深入分析講解

    go中map數(shù)據(jù)結(jié)構(gòu)不是線程安全的,即多個goroutine同時操作一個map,則會報錯,因此go1.9之后誕生了sync.Map,sync.Map思路來自java的ConcurrentHashMap
    2022-12-12

最新評論