欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺析Go常量為什么只支持基本數(shù)據(jù)類型

 更新時間:2023年09月13日 14:17:31   作者:煎魚  
這篇文章主要來和大家一起討論一下Golang中常量為什么只支持基本數(shù)據(jù)類型,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下

相信大家在接觸 Go 這門編程語言時,就會學到常量這個知識點。

各大編程語言會教你,常量是不可變變量的一種類型。只要定義了常量,你就可以安心的用他。不用擔心值在哪里就被程序莫名奇妙的給改了。

常量的使用例子

如下例子:

const s string = "腦子進煎魚了"
func main() {
    fmt.Println(s)
    const n = 500000000
    const d = 3e20 / n
    fmt.Println(d)
    fmt.Println(int64(d))
    fmt.Println(math.Sin(n))
}

輸出結果:

腦子進煎魚了
6e+11
600000000000
-0.28470407323754404

你可能會發(fā)現(xiàn)一個奇怪的點。那就是例子里都是基本的數(shù)據(jù)類型。那能不能用復雜點的數(shù)據(jù)類型呢,例如 Go 里比較經(jīng)典的切片。

如果是用 var 聲明:

var s = []string{"摸", "煎", "魚"}
func main() {
    fmt.Println(s)
}

正常輸出:[摸 煎 魚]

如果是用 const 聲明:

const s = []string{"摸", "煎", "魚"}

將會報錯:

./prog.go:7:11: []string{…} (value of type []string) is not constant

因為在 Go 中,僅支持字符、字符串、布爾和數(shù)值類型的常量。這和其他編程語言間多多少少還是有點不一樣的。

為什么不支持更多類型

為什么在 Go 中常量只支持這幾種基礎類型,為什么沒法支持復雜類型,甚至是所有類型?

這是非常奇怪的。畢竟 PHP 都能支持:

class MyClass
{
    const ABC = array('A', 'B', 'C');
    const A = '1';
    const B = '2';
    const C = '3';
    const NUMBERS = array(
        self::A,
        self::B,
        self::C,
    );
}

這又是出于什么緣由?

已有 10 年老提案

我認真翻閱了 Go issues 等相關資料,終于發(fā)現(xiàn)竟然在 2013 年(10 年前),就已經(jīng)有人提出過這個提案:

提出者 @RickySeltzer,認為:

var each1 = []byte{'e', 'a', 'c', 'h'}

可以正常運行。

const each2 = []byte{'e', 'a', 'c', 'h'}

不行,直接報錯:prog.go:7: const initializer []byte literal is not a constant

他認為這就是 Go 語言規(guī)范和設計上的缺陷,得改,得支持!

拒絕的論據(jù)是什么

對此也有各種爭論,老大哥 @Robert Griesemer,10 年前已

在為 Go 貢獻,現(xiàn)在依然還在...他對 Go 常量只支持基本類型這個設計給出了定論。

基于如下原因:

首先這不是語言的缺陷,也不是設計的缺陷。Go 語言的常量是故意設計成只支持基本類型。

基本類型到復雜類型的改變,這種變化的影響比我們看到的要深遠得多。需要考慮很多問題。

  • 常量 channel、常量指針、常量 maps、常量 slice 都要支持嗎?
  • 先支持常量 array 和 常量 struct?
  • 要支持到什么程度,以什么來作為標準決定?

設計上,Go 團隊期望類型系統(tǒng)(包括常量的含義)相對簡單,以免在編譯時出現(xiàn)問題。

  • 常量更多類型的支持,會增加復雜性。不清楚這樣做的好處是否值得(ROI)。
  • 常量是否可以尋址?const 數(shù)組的元素本身必須是 const 嗎?

匯總一下,潛臺詞就是:

  • 設計如下:常量只支持基本類型,是 Go 設計上就是這么決定的。
  • ROI 要衡量一下:沒有支持更多的復雜類型,是認為好處不多。也沒有想清楚這塊的緣由。
  • 少即是多:類型系統(tǒng)要保持少即是多(less is more)。

實戰(zhàn)中的騷操作

在相關提案的 issues 中看到歐神(@Changkun Ou)也參與了討論,他例舉了一個常量的經(jīng)典騷操作。

代碼如下:

- const ErrVerification = errors.New("crypto/rsa: verification error")
+ var ErrVerification = errors.New("crypto/rsa: verification error")

在對應的 Go 工程中可能是這么使用:

import "cropto/rsa"
func init() {
 rsa.ErrVerification = nil
}

這個場景我還真見過,一開始想定義 const,結果不支持。只能被迫 var。這不,就開天窗了。

總結

Go 核心團隊在綜合衡量 ROI 后,認為常量支持更多的類型在可預見的未來不會改變。因為將常量的概念擴展到基本類型之外將是一個重大變化,會產(chǎn)生各種影響。

在此刻(Go1)改變語言的門檻非常高,需要有明確的定義,要有完整的提案以及對成本和效益等的詳細分析。

如果出現(xiàn),只可能在未來的 Go2。但結合 rsc 最新的結論,沒有 Go2 的話,那如果未來真的做,那就是通過 GODEBUG 和 go.mod 的 go 版本號來實現(xiàn)了。

常量更多類型的支持,雖然已經(jīng)提出了 10 年。但目前 Go 核心團隊推進乏力,想必,可能還要個 5 年吧。

以上就是淺析Go常量為什么只支持基本數(shù)據(jù)類型的詳細內(nèi)容,更多關于Go常量的資料請關注腳本之家其它相關文章!

相關文章

  • Golang?并發(fā)下的問題定位及解決方案

    Golang?并發(fā)下的問題定位及解決方案

    由于?gin-swagger?是并發(fā)執(zhí)行的,?輸出的日志本身是錯位,這就導致無法定義是哪一個結構體缺少?tag?導致的,這篇文章主要介紹了Golang?并發(fā)下的問題定位及解決方案,需要的朋友可以參考下
    2022-03-03
  • 淺談Go1.18中的泛型編程

    淺談Go1.18中的泛型編程

    本文主要介紹了Go1.18中的泛型編程,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Go語言指針訪問結構體的方法

    Go語言指針訪問結構體的方法

    這篇文章主要介紹了Go語言指針訪問結構體的方法,涉及Go語言指針及結構體的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • Golang編程并發(fā)工具庫MapReduce使用實踐

    Golang編程并發(fā)工具庫MapReduce使用實踐

    這篇文章主要為大家介紹了Golang并發(fā)工具庫MapReduce的使用實踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-04-04
  • Go中過濾范型集合性能示例詳解

    Go中過濾范型集合性能示例詳解

    這篇文章主要為大家介紹了Go中過濾范型集合性能示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • 如何在Go中使用切片容量和長度

    如何在Go中使用切片容量和長度

    這篇文章主要介紹了如何在Go中使用切片容量和長度,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • 如何在golang中使用shopspring/decimal來處理精度問題

    如何在golang中使用shopspring/decimal來處理精度問題

    本文主要介紹了如何在golang中使用shopspring/decimal來處理精度問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • Go語言中的數(shù)據(jù)格式(json、xml?、msgpack、protobuf)使用總結

    Go語言中的數(shù)據(jù)格式(json、xml?、msgpack、protobuf)使用總結

    在分布式的系統(tǒng)中,因為涉及到數(shù)據(jù)的傳輸,所以一定會進行數(shù)據(jù)的交換,此時就要定義數(shù)據(jù)交換的格式,例如二進制、Json、Xml等等。本文總結了Go語言中的數(shù)據(jù)格式,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • Go實現(xiàn)基于RSA加密算法的接口鑒權

    Go實現(xiàn)基于RSA加密算法的接口鑒權

    這篇文章主要介紹了Go實現(xiàn)基于RSA加密算法的接口鑒權,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-06-06
  • Golang通脈之map詳情

    Golang通脈之map詳情

    這篇文章主要介紹了Golang通脈之map,Go語言中提供的映射關系容器為map,其內(nèi)部使用散列表(hash)實現(xiàn),map 是一種無序的鍵值對的集合。map 最重要的一點是通過 key 來快速檢索數(shù)據(jù),key 類似于索引,指向數(shù)據(jù)的值 map 是一種集合,所以可以像迭代數(shù)組和切片那樣迭代它
    2021-10-10

最新評論