Go語言作為出現比較晚的一門編程語言,在其原生支持高并發、云原生等領域的優秀表現,像目前比較流行的容器編排技術Kubernetes、容器技術Docker都是用Go語言寫的,像Java等其他面向對象的語言,雖然也能做云原生相關的開發,但是支持的程度遠沒有Go語言高,憑借其語言特性和簡單的編程方式,彌補了其他編程語言一定程度上的不足,一度成為一個熱門的編程語言。
創新互聯是一家集網站建設,太和企業網站建設,太和品牌網站建設,網站定制,太和網站建設報價,網絡營銷,網絡優化,太和網站推廣為一體的創新建站企業,幫助傳統企業提升企業形象加強企業競爭力。可充分滿足這一群體相比中小企業更為豐富、高端、多元的互聯網需求。同時我們時刻保持專業、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們為更多的企業打造出實用型網站。
最近在學習Go語言,我之前使用過C#、Java等面向對象編程的語言,發現其中有很多的編程方式和其他語言有區別的地方,好記性不如爛筆頭,總結一下,和其他語言做個對比。這里只總結差異的地方,具體的語法不做詳細的介紹。
種一棵樹最好的時間是十年前,其次是現在。
3)變量初始化時候可以和其他語言一樣直接在變量后面加等號,等號后面為要初始化的值,也可以使用變量名:=變量值的簡單方式
3)變量賦值 Go語言的變量賦值和多數語言一致,但是Go語言提供了多重賦值的功能,比如下面這個交換i、j變量的語句:
在不支持多重賦值的語言中,交換兩個變量的值需要引入一個中間變量:
4)匿名變量
在使用其他語言時,有時候要獲取一個值,卻因為該函數返回多個值而不得不定義很多沒有的變量,Go語言可以借助多重返回值和匿名變量來避免這種寫法,使代碼看起來更優雅。
假如GetName()函數返回3個值,分別是firstName,lastName和nickName
若指向獲得nickName,則函數調用可以這樣寫
這種寫法可以讓代碼更清晰,從而大幅降低溝通的復雜度和維護的難度。
1)基本常量
常量使用關鍵字const 定義,可以限定常量類型,但不是必須的,如果沒有定義常量的類型,是無類型常量
2)預定義常量
Go語言預定義了這些常量 true、false和iota
iota比較特殊,可以被任務是一個可被編譯器修改的常量,在每個const關鍵字出現時被重置為0,然后在下一個const出現之前每出現一個iota,其所代表的數字會自動加1.
3)枚舉
1)int 和int32在Go語言中被認為是兩種不同類型的類型
2)Go語言定義了兩個浮點型float32和float64,其中前者等價于C語言的float類型,后者等價于C語言的double類型
3)go語言支持復數類型
復數實際上是由兩個實數(在計算機中使用浮點數表示)構成,一個表示實部(real)、一個表示虛部(imag)。也就是數學上的那個復數
復數的表示
實部與虛部
對于一個復數z=complex(x,y),就可以通過Go語言內置函數real(z)獲得該復數的實部,也就是x,通過imag(z)獲得該復數的虛部,也就是y
4)數組(值類型,長度在定義后無法再次修改,每次傳遞都將產生一個副本。)
5)數組切片(slice)
數組切片(slice)彌補了數組的不足,其數據結構可以抽象為以下三個變量:
6)Map 在go語言中Map不需要引入任何庫,使用很方便
Go循環語句只支持for關鍵字,不支持while和do-while
goto語句的語義非常簡單,就是跳轉到本函數內的某個標簽
今天就介紹到這里,以后我會在總結Go語言在其他方面比如并發編程、面向對象、網絡編程等方面的不同及使用方法。希望對大家有所幫助。
這樣子來講:float和int都是固定長度的,4字節(32位機子)
int是精確的,超出范圍就溢出了。數據錯誤了。
而float并不是單純的101010這樣存儲,是把4個字節劃分為
符號位,指數位,尾數位 比如1.123123*10^35;
3個部分固定的,因為有指數,存儲的范圍當然比int大了。
但是3個部分也有范圍限制,所以當你精度值越大時,月不精確了。
在公司項目中看到關于錢的數據在接口展示、添加修改的各種情況下結構體中相應字段用的都是string類型。覺得不太合理,因此查閱了一些資料,整理如下。
在網上搜到一篇博客:
在程序計算中涉及到錢的時候,為什么要用Decimal而不是Float
博客中介紹,如果用float類型再轉為decimal類型時會造成精度丟失。轉為string后再轉為decimal則可以解決問題,保證精度。看著好像是很完美的回答了我想要了解的問題,但仔細一看用的語言是python,于是我便親自試了下:
結果確實如此,但看版本是2.7,我懷疑是不是python2.7版本落后,因此存在問題,于是又換了python3,再次測試:
結論依然是一樣。好吧,證實了,對于python確實應該先轉為string再轉為decimal。
但是,python是這樣,難道go也是這樣嗎,于是我又開始了進一步測試:
go中decimal使用第三方庫
這里是直接用float64轉為decimal,并沒有通過string中轉,結果輸出如下:
乍一看,看著好像是精度丟失了似的,但是對比后我們發現,float64和decimal前后都是一致的,也就是說float64轉為decimal之后,保持了原樣。那些看起來小數點后位數很多的結果,是因為float64浮點類型計算產生的問題,跟轉換并沒有關系。
為了驗證這一結論,我又寫了下面的測試:
不使用浮點類型相加,而用decimal類型相加,這樣輸出結果果然沒問題了:
因此我們可以得出結論:對于go語言,在把float轉換為decimal類型時,并不需要像python一樣通過string中轉,也依然可以保持精度。進一步,我們也可以想到上面的問題,對于錢,在結構體字段中,我們完全可以直接使用float類型,并不需要用string類型。而且好處時,使用float數值類型,無論對于前端還是后端,在進行數值范圍驗證的時候,會更方便,不必把string轉為float后再驗證了。
上面提到了decimal包,我們這里簡單看下,里面的常用的方法:
定義decimal的幾種方式:
decimal數值運算
比較:
我們再看下浮點精度運算不準確的原因,這篇文章講解的比較細
浮點精度(float、double)運算不精確的原因
精度運算不準確這是為什么呢?我們接下來就需要從計算機所有數據的表現形式二進制說起了。如果大家很了解二進制與十進制的相互轉換,那么就能輕易的知道精度運算不準確的問題原因是什么了。
接下來我們看一個簡單的例子 2.1 這個十進制數轉成二進制是什么樣子的。
落入無限循環結果為 10.0001100110011........ , 我們的計算機在存儲小數時肯定是有長度限制的,所以會進行截取部分小數進行存儲,從而導致計算機存儲的數值只能是個大概的值,而不是精確的值。從這里看出來我們的計算機根本就無法使用二進制來精確的表示 2.1 這個十進制數字的值,連表示都無法精確表示出來,計算肯定是會出現問題的。
1、為什么數值表示用decimal 不用double
2、在程序計算中涉及到錢的時候,為什么要用Decimal而不是Float
3、MySQL數據類型DECIMAL用法
4、浮點精度(float、double)運算不精確的原因
文章標題:go語言浮點型講解視頻 go語言賦值
網頁網址:http://m.newbst.com/article14/ddshcge.html
成都網站建設公司_創新互聯,為您提供微信公眾號、、品牌網站制作、電子商務、Google、動態網站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯