1.3 Go語言基礎之數據類型

Go語言中有豐富的數據類型,除了基本的整型、浮點型、布爾型、字符串外,還有數組、切片、結構體、函數、map、通道(channel)等。Go 語言的基本類型和其他語言大同小異。

一、整型

1.1 基本類型

整型分為以下兩個大類: 按長度分為:int8(8位2進制數)、int16、int32、int64 對應的無符號整型:uint8、uint16、uint32、uint64

其中,uint8就是我們熟知的byte型,int16對應C語言中的short型,int64對應C語言中的long型。

類型描述
uint8無符號 8位整型 (0 到 255)
uint16無符號 16位整型 (0 到 65535)
uint32無符號 32位整型 (0 到 4294967295)
uint64無符號 64位整型 (0 到 18446744073709551615)
int8有符號 8位整型 (-128 到 127)
int16有符號 16位整型 (-32768 到 32767)
int32有符號 32位整型 (-2147483648 到 2147483647)
int64有符號 64位整型 (-9223372036854775808 到 9223372036854775807)

1.2 其他數字類型

類型描述
uint32位操作系統上就是uint32,64位操作系統上就是uint64
int32位操作系統上就是int32(相當于內存最大空間是2^32 大概就是4g),64位操作系統上就是int64
uintptr無符號整型,用于存放一個指針

注意: 在使用intuint類型時,不能假定它是32位或64位的整型,而是考慮intuint可能在不同平臺上的差異。

注意事項 獲取對象的長度的內建len()函數返回的長度可以根據不同平臺的字節長度進行變化。實際使用中,切片或 map 的元素數量等都可以用int來表示。在涉及到二進制傳輸、讀寫文件的結構描述時,為了保持文件的結構不會受到不同編譯目標平臺字節長度的影響,不要使用intuint

1.3 八進制&十六進制

package mainimport "fmt"func main(){// 十進制var a int = 10fmt.Printf("%d \n", a)  // 10fmt.Printf("%b \n", a)  // 1010  占位符%b表示二進制// 八進制  以0開頭var b int = 077fmt.Printf("%o \n", b)  // 77// 十六進制  以0x開頭var c int = 0xfffmt.Printf("%x \n", c)  // fffmt.Printf("%X \n", c)  // FF// 變量的內存地址fmt.Printf("%p \n", &a)  // 0xc00004c080  占位符%p表示十六進制的內存地址

關于進制轉換之后會在(https://www.cnblogs.com/forever521Lee/p/10620859.html)

占位符總結(https://www.cnblogs.com/forever521Lee/p/10620865.html)

二、浮點型

Go語言支持兩種浮點型數:float32float64。這兩種浮點型數據格式遵循IEEE 754標準: float32 的浮點數的最大范圍約為 3.4e38,可以使用常量定義:math.MaxFloat32float64 的浮點數的最大范圍約為 1.8e308,可以使用一個常量定義:math.MaxFloat64

打印浮點數時,可以使用fmt包配合動詞%f,代碼如下:

package main
import ("fmt""math"
)
func main() {fmt.Printf("%f\n", math.Pi)fmt.Printf("%.2f\n", math.Pi)  //小數點后精確2位
}

浮點數特別需要注意金融方面、p2p涉及到錢方面的浮點型操作時幾毛幾精確運算時,就如同下面(不精確)

1553842466851

兩種方式解決:

1、轉換成字符串,然后再去進行一個運算操作;

2、加入系統精確到分,那么我們就將其乘1000進行整數操作,這樣就可以避免出現錯誤

三、復數

complex64和complex128

var c1 complex64
c1 = 1 + 2i
var c2 complex128
c2 = 2 + 3i
fmt.Println(c1)
fmt.Println(c2)

復數有實部和虛部,complex64的實部和虛部為32位,complex128的實部和虛部為64位。

四、布爾值

Go語言中以bool類型進行聲明布爾型數據,布爾型數據只有true(真)false(假)兩個值。

注意:

  1. 布爾類型變量的默認值為false
  2. Go 語言中不允許將整型強制轉換為布爾型. (比如py可以將0和1轉換為true和false,但是go語言中是不允許的)
  3. 布爾型無法參與數值運算,也無法與其他類型進行轉換

五、字符串

Go語言中的字符串以原生數據類型出現,使用字符串就像使用其他原生數據類型(int、bool、float32、float64 等)一樣。 Go 語言里的字符串的內部實現使用UTF-8編碼。 字符串的值為雙引號(")中的內容,可以在Go語言的源碼中直接添加非ASCII碼字符,例如:

s1 := "hello"
s2 := "你好"

5.1 字符串轉義符

Go 語言的字符串常見轉義符包含回車、換行、單雙引號、制表符等,如下表所示。

轉義符含義
\r回車符(返回行首)
\n換行符(直接跳到下一行的同列位置)
\t制表符
單引號
雙引號
\反斜杠(在go語言中用于轉義

舉個例子:

package main
import ("fmt"
)
func main() {fmt.Println("str := \"c:\\Code\\lesson1\\go.exe\"")
}

5.2 多行字符串

Go語言中要定義一個多行字符串時,就必須使用反引號字符:

s1 := `第一行
第二行
第三行
`
fmt.Println(s1)

反引號間換行將被作為字符串中的換行,但是所有的轉義字符均無效,文本將會原樣輸出。

5.3 字符串的常用操作

方法介紹
len(str)求長度
+或fmt.Sprintf拼接字符串
strings.Split分割
strings.contains判斷是否包含
strings.HasPrefix,strings.HasSuffix前綴/后綴判斷
strings.Index(),strings.LastIndex()子串出現的位置
strings.Join(a[]string, sep string)join操作

舉例

    s1:= "hardenMVP"fmt.Println(len(s1))// 字符串拼接s2 := "houston"fmt.Println(s1+s2)s3 := fmt.Sprintf("%s----%s", s1, s2)fmt.Println(s3)// 分割ret := strings.Split(s1, "n")fmt.Println(ret)// 判斷是否包含ret2 := strings.Contains(s1, "MVP")fmt.Println(ret2)// 判斷前綴和后綴ret3 := strings.HasPrefix(s1, "har")ret4 := strings.HasSuffix(s1, "VP")fmt.Println(ret3, ret4)// 求子串的位置s4 := "applepen"fmt.Println(strings.Index(s4, "p"))fmt.Println(strings.LastIndex(s4, "p"))// joina1 := []string{"Python", "PHP", "JavaScript", "Ruby", "Golang"}fmt.Println(strings.Join(a1, "-"))

5.4 byte和rune類型

組成每個字符串的元素叫做“字符”,可以通過遍歷或者單個獲取字符串元素獲得字符。 字符用單引號(’)包裹起來,如:

var a := '中'
var b := 'x'

Go 語言的字符有以下兩種: 1. uint8類型,或者叫 byte 型,代表了ASCII碼(能表示的最大位數是8位(2^8-1 也就是0-255)對于英文來說足夠用了)的一個字符。 2. rune類型(可以動態識別(識別到底是中文還是英文)),代表一個 UTF-8字符

utf-8編碼下一個中文占3-4位(個字節)

s1 := "Golang"
c1 := 'G'  // ASCII碼下占一個字節(8位 8bit(1bit就是01(二進制)))
fmt.Println(s1, c1)
s2 := "中國"
c2 := '中'  // UTF-8編碼下一個中文占3個字節
fmt.Println(s2, c2)

當需要處理中文、日文或者其他復合字符時,則需要用到rune類型。rune類型實際是一個int32

Go 使用了特殊的 rune 類型來處理 Unicode,讓基于 Unicode 的文本處理更為方便,并且使用 byte 型進行默認字符串處理,性能和擴展性都有照顧。

// 遍歷字符串
func traversalString() {s := "hello沙河"for i := 0; i < len(s); i++ { //bytefmt.Printf("%v(%c) ", s[i], s[i])  //默認for循環按照ASCII碼去打印 %c表示輸出單個字符}fmt.Println()for _, r := range s { //rune  for range 循環 是按照rune類型去遍歷的fmt.Printf("%v(%c) ", r, r) //for range循環后是按照utf8編碼打印}fmt.Println()
}

輸出:

104(h) 101(e) 108(l) 108(l) 111(o) 230(?) 178(2) 153() 230(?) 178(2) 179(3) 
104(h) 101(e) 108(l) 108(l) 111(o) 27801(沙) 27827(河) 

注意:

1、遍歷中英文混合字符用for range循環

2、字符串底層是一個byte數組,所以可以和[]byte類型相互轉換。字符串是不能修改的 字符串是由byte字節組成,所以字符串的長度是byte字節的長度。 rune類型用來表示utf8字符,一個rune字符由一個或多個byte組成。

5.5 修改字符串

要修改字符串,需要先將其轉換成[]rune[]byte,完成后再轉換為string。無論哪種轉換,都會重新分配內存,并復制字節數組。

func changeString() {s1 := "big"// 強制類型轉換byteS1 := []byte(s1)byteS1[0] = 'p'fmt.Println(string(byteS1))s2 := "白蘿卜"runeS2 := []rune(s2)runeS2[0] = '紅'fmt.Println(string(runeS2))
}

六、類型轉換

Go語言中只有強制類型轉換,沒有隱式類型轉換。 基本語法:

T(表達式)

其中,T表示要轉換的類型。表達式包括變量、復雜算子和函數返回值等. 比如計算直角三角形的斜邊長。

例1:

func sqrtDemo() {var a, b = 3, 4var c int// math.Sqrt()接收的參數是float64類型,需要強制轉換c = int(math.Sqrt(float64(a*a + b*b)))fmt.Println(c)
}

例2:

// 強制類型轉換
s5 := "big"
// 將字符串強制轉換成字節數組類型
byterArray := []byte(s5)
fmt.Println(byterArray)
byterArray[0] = 'p'
fmt.Println(byterArray)
// 將字節數組強制轉換成字符串類型
s5 = string(byterArray)
fmt.Println(s5)

轉載于:https://www.cnblogs.com/forever521Lee/p/10643489.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248216.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248216.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248216.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Oracle新建用戶并授權

使用擁有dba權限的用戶都可以新建用戶以及授權 1、新建用戶 create user 用戶名 identified by 密碼&#xff1b; 2、授權 grant connect, resource to 用戶名; grant dba to 用戶名; 轉載于:https://www.cnblogs.com/langgj/p/11387485.html

【網絡安全】關于ARP攻擊的原理以及在Kali Linux環境下的實現

轉自&#xff1a;https://www.cnblogs.com/rebrust/p/6096101.html 全文摘要 本文講述內容分為兩部分&#xff0c;前半部分講述ARP協議及ARP攻擊原理&#xff0c;后半部分講述在Kali Linux環境下如何實現ARP攻擊以及ARP欺騙&#xff0c;如果對于ARP攻擊的背景和原理不感興趣的話…

動態創建英雄圖片

推薦在寫動態生成標簽數據的時候&#xff0c;提前寫一遍htmlcss的結構&#xff0c;方便提供寫照模板 <input type"button" value"按鈕"><style type"text/css">* {margin: 0;padding: 0;list-style: none;}ul {width: 600px;margin…

第五節:EF Core中的三類事務(SaveChanges、DbContextTransaction、TransactionScope)

一. 說明 EF版本的事務介紹詳見&#xff1a; 第七節: EF的三種事務的應用場景和各自注意的問題(SaveChanges、DBContextTransaction、TransactionScope)。 本節主要介紹EF Core下的三種事務的用法和各自的使用場景&#xff0c;其中SaveChanges和DBContextTransaction事務與EF版…

教你簡單理解分布式與傳統單體架構的區別

教你簡單理解分布式與傳統單體架構的區別 原文:教你簡單理解分布式與傳統單體架構的區別分布式是一種系統架構方式&#xff0c;而在分布式系統中一般基于中間件進行開發&#xff0c;消息中間件是分布式系統中比較核心的中間件之一。這三樣東西隨便拿出一個來都可能要說上半天&a…

js(Dom+Bom)第五天(1)

JavaScript BOM介紹 概念 BOM&#xff08;Browser Object Model&#xff09;即瀏覽器對象模型。 本質&#xff1a; 通過對象抽象瀏覽器中的一些功能 例如&#xff1a;&#xff08;刷新頁面&#xff0c;alert,confirm,pormpt,跳轉 ...&#xff09;BOM頂級對象 window對象是js中…

第六節:深究事務的相關性質、隔離級別及對應的問題、死鎖相關

一. 相關概念 前面系列中的章節的&#xff1a; 第二十二節: 以SQLServer為例介紹數據庫自有的鎖機制(共享鎖、更新鎖、排它鎖等&#xff09;和事務隔離級別 介紹了各種鎖以及事務的隔離級別&#xff0c;是從數據庫的角度進行介紹的&#xff0c;本章節是通過EF Core為載體&…

js(Dom+Bom)第五天(2)

webAPI 01-事件監聽 為什么要學事件監聽 之前給元素注冊事件的時候,同一個事件會被覆蓋掉事件監聽的本質 通過另外一種方式給元素注冊事件, 同時可以解決同一個事件不會被覆蓋掉.知識點-通過 on 方式給元素注冊事件 之前注冊事件的方式:事件源.onclick function() {}on是一種…

UIAutomator簡介

簡介 Android 4.3發布的時候包含了一種新的測試工具–uiautomator&#xff0c;uiautomator是用來做UI測試的。也就是普通的手工測試&#xff0c;點擊每個控件元素 看看輸出的結果是否符合預期。比如 登陸界面 分別輸入正確和錯誤的用戶名密碼然后點擊登陸按鈕看看是否能否登陸以…

從零開始實現ASP.NET Core MVC的插件式開發(五) - 插件的刪除和升級

標題&#xff1a;從零開始實現ASP.NET Core MVC的插件式開發(五) - 使用AssemblyLoadContext實現插件的升級和刪除 作者&#xff1a;Lamond Lu 地址&#xff1a;https://www.cnblogs.com/lwqlun/p/11395828.html 源代碼&#xff1a;https://github.com/lamondlu/Mystique 前景回…

JDBC Druid式link

準備工作&#xff1a;導入包------druid-1.0.9.jar src文件夾下放下druid.properties文件 且其中的url和數據庫名要配置完備 import JdbcUtils.JDBCUtils;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.PseudoColumnUsage;import java.sql…

vs strcore.cpp(156) 內存泄漏

在一個靜態函數的線程回調中&#xff0c;一個cstring的對象沒釋放。 遇到這種問題&#xff1a; 1、查看所有的指針對象&#xff0c;有沒有合適的回收 2、查看代碼的malloc&#xff0c;看看有沒有free 3、一點一點注釋代碼&#xff0c;定位位置 轉載于:https://www.cnblogs.com/…

js(Dom+Bom)第六天(1)

webAPI 01-鍵盤事件 知識點-onkeydown事件[掌握] onkeydown: 當鍵盤上的鍵被按下時候觸發的一個事件知識點-onkeyup事件[掌握] onkeyup: 鍵盤上鍵彈起時候觸發的一個事件知識點-onkeypress事件[了解] onkeypress: 當鍵盤上的鍵被按下時候觸發的事件onkeydown 和 onkeypress的區…

【JavaWeb】石家莊地鐵搭乘系統——第一版(功能尚未完善)

小組成員&#xff1a;高達&#xff0c;程超然 項目目的&#xff1a;能算出地鐵搭乘的最優路線并顯示在地圖上 個人任務&#xff1a;調用隊友寫好的java代碼&#xff0c;將結果顯示在網頁上 新的知識&#xff1a;百度地圖API&#xff0c;使用JQuery的AJAX異步提交 進度&#xff…

掃描槍連接zebra打印機打印條碼標簽無需電腦

在一些流水線生產的現場&#xff0c;需要及時打印條碼標簽&#xff0c;由于現場環境和空間限制&#xff0c;無法擺放電腦或者通過連接電腦來打印條碼標簽的速度太慢&#xff0c; 瑞科條碼特提供了一套掃描槍直接連接條碼打印機&#xff0c;掃描槍掃描條碼之后直接打印輸出條碼標…

簡單的動畫函數封裝(1)

//創建簡單的動畫函數封裝效果(目標對象&#xff0c;目標位置) function animate(obj,target){var id setInterval(function(){if(obj.offsetLeft > target){clearInterval(id);}else{obj.style.left obj.offsetLeft 5 px;}},30) }可以實現如下效果&#xff1a; <div…

NodeMCU學習(三) : 進入網絡世界

閱讀原文可以訪問我的個人博客 把NodeMCU連接到路由器網絡上 NodeMCU可以被配置為Station模式和softAP模式或者Station AP模式&#xff0c;當它被配置為Station模式時&#xff0c;就可以去連接Access Point&#xff08;如路由器&#xff09;。當它被配置為Soft Access Point模…

操作系統原理之進程調度與死鎖(三)

一、進程調度的功能與時機 進程調度&#xff1a;進程調度的功能由操作系統的進程調度程序完成 具體任務&#xff1a;按照某種策略和算法從就緒態進程中為當前空閑的CPU選擇在其上運行的新進程。 進程調度的時機&#xff1a;進程正常或異常結束、進程阻塞、有更高優先級進程到來…

模擬京東側邊欄

思路&#xff1a; // 1. 獲取元素 // 1.1 獲取一組li // 1.2 獲取一組類名為item的div // 1.3 獲取類名為slide的div// 2. 循環遍歷給每一個li注冊onmouseenter&#xff0c;并且每一個li添加一個index表示索引 // 2.1 循環遍歷把所有的li的類名設置為,把所有的item的display設…

ViewPager + TabLayout + Fragment + MediaPlayer的使用

效果圖 在gradle里導包 implementation com.android.support:design:28.0.0 activity_main <?xml version"1.0" encoding"utf-8"?><LinearLayout xmlns:android"http://schemas.android.com/apk/res/android" xmlns:tools"http…