【go從入門到精通】go基本類型和運算符用法

? ? ? ? ? ? ?大家好,這是我給大家準備的新的一期專欄,專門講golang,從入門到精通各種框架和中間件,工具類庫,希望對go有興趣的同學可以訂閱此專欄。

---------------------------------------------------------------------------------------------------------------------------------

? ? ? ? ? ? ?上一篇文章中?【go從入門到精通】go包,內置類型和初始化順序? 偏重概念和知識,想必大家都對如何開始寫代碼已經開始蠢蠢欲動了,但是不要著急,基礎知識扎實,能讓你少走很多彎道。

基本數據類型

? ? ? ? 正如前一篇的內容,go的基本數據類型和其他語言都差不多,我們可以先看看go是如何聲明變量的。

標準聲明

Go語言的變量聲明格式為:

    var 變量名 變量類型

變量聲明以關鍵字var開頭,變量類型放在變量的后面,行尾無需分號。 舉個例子:

    var str string var i   int32var b   bool 

批量聲明

每聲明一個變量就需要寫var關鍵字會比較繁瑣,go語言中還支持批量變量聲明:

    var (a stringb intc boold float32)

變量的初始化

Go語言在聲明變量的時候,會自動對變量對應的內存區域進行初始化操作。每個變量會被初始化成其類型的默認值,例如: 整型和浮點型變量的默認值為0。 字符串變量的默認值為空字符串。 布爾型變量默認為false。 切片、函數、指針變量的默認為nil

當然我們也可在聲明變量的時候為其指定初始值。變量初始化的標準格式如下:

    var 變量名 類型 = 表達式

舉個例子:

? ? var a int32 = 1 

?類型推導
有時候我們會將變量的類型省略,這個時候編譯器會根據等號右邊的值來推導變量的類型完成初始化。

? ? var str = "pprof.cn"
? ? var i = 1
短變量聲明
在函數內部,可以使用更簡略的 := 方式聲明并初始化變量。

package mainimport ("fmt"
)func main() {var i = 10j := 100fmt.Println(i,j)
}


匿名變量
????????在使用多重賦值時,如果想要忽略某個值,可以使用匿名變量。 匿名變量用一個下劃線_表示,例如我希望通過strconv。Atoi來將數字字符串轉整型數字,由于這個函數有2個返回值,我只想用i接收最終的整型變量,用_來作為匿名變量,可以用下面的代碼來實現:

package mainimport ("fmt""strconv"
)func main() { i,_:=strconv.Atoi("100")fmt.Println(i)
}


? ? ? ? ? ? 匿名變量不占用命名空間,不會分配內存,所以匿名變量之間不存在重復聲明。 (在Lua等編程語言里,匿名變量也被叫做啞元變量。)

注意事項:

? ? 函數外的每個語句都必須以關鍵字開始(var、const、func等)

? ? :=不能使用在函數外。

? ? _多用于占位,表示忽略值。

const常量的初始化


????????相對于變量,常量是恒定不變的值,多用于定義程序運行期間不會改變的那些值。 常量的聲明和變量聲明非常類似,只是把var換成了const,常量在定義的時候必須賦值。

? ? const pi = 3.1415??

const同時聲明多個常量時,如果省略了值則表示和上面一行的值相同。 例如:

? ? const (
? ? ? ? n1 = 100
? ? ? ? n2
? ? ? ? n3
? ? )
上面示例中,常量n1、n2、n3的值都是100。

其他注意的

但是這里要注意的一些區別是:

? ? ? (1) 空指針值 nil :

package mainimport ("fmt"
) 
func main(){i := 0p := &i if p == nil {fmt.Println("p is nil")} 
}

? ? ? ?(2)多行字符串的輸出方式:

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

package mainimport ("fmt"
) 
func main(){s := `thisisgolangprogram`fmt.Println(s)
}

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

? ??

? ? ? (3)byte和rune類型

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

Go 語言的字符有以下兩種:

? ? uint8類型,或者叫 byte 型,代表了ASCII碼的一個字符。

? ? rune類型,代表一個 UTF-8字符。

    var a := '啊'var b := 'b'

當需要處理中文、日文或者其他復合字符時,則需要用到rune類型。rune類型實際是一個int32
Go 使用了特殊的?rune?類型來處理?Unicode,讓基于?Unicode的文本處理更為方便,也可以使用?byte?型進行默認字符串處理,性能和擴展性都有照顧

package mainimport ("fmt"
)func disp() {s := "hello 你好"for i := 0; i < len(s); i++ { //bytefmt.Printf("%v(%c) ", s[i], s[i])}fmt.Println("")for _, r := range s { //runefmt.Printf("%v(%c) ", r, r)}
}
func main() {disp()
}

輸出:

104(h) 101(e) 108(l) 108(l) 111(o) 32( ) 228(?) 189(?) 160( ) 229(?) 165(¥) 189(?)?
104(h) 101(e) 108(l) 108(l) 111(o) 32( ) 20320(你) 22909(好)

因為UTF8編碼下一個中文漢字由3-4個字節組成,所以我們不能簡單的按照字節去遍歷一個包含中文的字符串,否則就會出現上面輸出中第一行的結果。

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

我們有時候會有這樣的需求,判斷某個游戲玩家起的昵稱不能超過10個漢字或者字符,那么我想你這個時候就知道用哪種方式了。

?(4)修改字符串

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

package main
import ("fmt"
)func modstring1(s string) {// 強制類型轉換bytes := []byte(s)bytes[0] = 'H'fmt.Println(string(bytes))
}
func modstring2(s string) {// 強制類型轉換bytes := []rune(s)bytes[0] = '你'fmt.Println(string(bytes))
}
func main() {s := "hello"modstring1(s)modstring2(s)
}

? ? ? (5)array數組? ??

? ? ? ? ? ? go的數組array是同一種數據類型的固定長度的序列。

? ? ? ? ?? (1)如何定義一個數組呢?我們可以用: var 數組名? ?[長度],不過你要注意的是長度也是數組類型的一部分。
? ? ? ? ? ? ?比如:

????????????????var a [10]int 和var a [100]int是不同的類型? ??

? ? ? ? ? ? ? ?var arr0 [5]int = [5]int{1, 2, 3}? // 未初始化元素值為 0。?

? ? ? ? ? ? ? ?c := [5]int{2: 100, 4: 200} // 使用索引號初始化元素。

? ? ? ? ? ? ? ?var arr2 = [...]int{1, 2, 3, 4, 5, 6}??// 通過初始化值確定數組長度。
? ? ? ? ??

? ? ? ? ? ? (2)數組可以通過下標進行訪問,下標是從0開始,最后一個元素下標是:len-1

? ? ? ? ? 遍歷數組有兩種方式:

? ? for i := 0; i < len(a); i++ {
? ? }
? ? for index, v := range a {
? ? }


? ? ? ? ? ? ?(3)訪問越界,如果下標在數組合法范圍之外,則觸發訪問越界,會panic

? ? ? ? ?

package mainimport "fmt"func main() {a := [3]int{1, 2, 3}b := a[0]c := a[6]fmt.Println(b, c)
}

?運行時報錯信息如下:

PS E:\project\go\hello> ./main.exe
panic: runtime error: index out of range [6] with length 3goroutine 1 [running]:
main.main()E:/project/go/hello/main.go:8 +0x1d

? ? ? ? ?
? ? ? ?????????(4)?數組是值類型,賦值和傳參會復制整個數組,而不是指針。因此改變副本的值,不會改變本身的值。

? ? ? ?此時此刻,? ? 一定有人想做下驗證,于是寫了如下代碼:

package mainimport "fmt"func fun1(a []int) {a[0] = 100
}
func main() {a := []int{1, 2, 3}fun1(a)fmt.Println(a[0])
}

? ? ? ?這段代碼似乎是想修改數組a的第一個元素的值,但是很不幸,你可能認為調用fun1之后,a的第一個元素的值仍然是1。

? ? ? 為什么呢?? 因為你傳的不是數組,而且切片。 數組是指定了長度,且是值傳遞 而切片是沒有指定長度,且是引用傳遞。所以你的代碼改成這樣就沒有問題了:

package mainimport "fmt"func fun1(a [3]int) {a[0] = 100
}
func main() {a := [3]int{1, 2, 3}fun1(a)fmt.Println(a[0])
}

? ?(6)slice和map

? ? ? ?后邊逐步針對這slIce,map,以及和數組的三者之間的比較差異來細細道來。?

類型轉換


????????Go語言中只有強制類型轉換,沒有隱式類型轉換。該語法只能在兩個類型之間支持相互轉換的時候使用。

強制類型轉換的基本語法如下:

? ? ? ? 目標類型(表達式)
其中,目標類型表示要轉換的類型。表達式包括變量、復雜算子和函數返回值等.

package mainimport ("fmt"
)func main() {i := int32(0)var j intj = i fmt.Println(j) 
}

?比如這段代碼,簡簡單單,但是編譯的時候報錯:

cannot use i (variable of type int32) as int value in assignment

所以我們在把i賦值給j的時候,需要做個類型強制轉換,j = int(i)

運算符

? ? ? ? ?go的常用的運算符用法和其他語言沒有區別

? ? ??

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

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

相關文章

與字體有關的CSS

隱藏多余字體 text-overflow: ellipsis &#xff08;多余文本顯示省略號&#xff09; 需要配合overflow使用 -webkit-box-orient: vertical; display: -webkit-box; -webkit-line-clamp: number &#xff08;超出多少行顯示省略號&#xff09; 強制顯示一行 whi…

.NET高級面試指南專題十四【 觀察者模式介紹,最常用的設計模式之一】

簡介&#xff1a; 觀察者模式&#xff08;Observer Pattern&#xff09;是一種行為型設計模式&#xff0c;其目的是定義了一種一對多的依賴關系&#xff0c;當一個對象的狀態發生變化時&#xff0c;所有依賴于它的對象都會得到通知并自動更新。 原理&#xff1a; 在觀察者模式中…

從零開始搭建web組態

成果展示&#xff1a;by組態[web組態插件] 一、技術選擇 目前只有兩種選擇&#xff0c;canvas和svg Canvas: 是一個基于像素的渲染引擎&#xff0c;使用JavaScript API在畫布上繪制圖像&#xff0c;它的優點包括&#xff1a; Canvas渲染速度快&#xff0c;適合處理大量圖像和…

TIOBE 2024榜單啟示:程序員如何把握未來編程趨勢與機遇

程序員如何選擇職業賽道&#xff1f; 程序員的職業賽道就像是一座迷宮&#xff0c;有前端的美麗花園&#xff0c;后端的黑暗洞穴&#xff0c;還有數據科學的神秘密室。你準備好探索這個充滿挑戰和機遇的迷宮了嗎&#xff1f;快來了解如何選擇職業賽道吧&#xff01; 方向一…

linux時間校準(ntpdate)

在Linux中&#xff0c;可以使用ntpdate命令來進行時間校準。 首先&#xff0c;打開終端并輸入以下命令安裝ntpdate工具 yum install ntpdate 然后&#xff0c;運行以下命令來同步系統的時間與網絡上的NTP服務器 ntpdate time.nist.gov 若要設置定期自動更新時間&#xff0c;可…

CSS中如何解決 1px 問題?

1px 問題指的是&#xff1a;在一些 Retina屏幕 的機型上&#xff0c;移動端頁面的 1px 會變得很粗&#xff0c;呈現出不止 1px 的效果。原因很簡單——CSS 中的 1px 并不能和移動設備上的 1px 劃等號。它們之間的比例關系有一個專門的屬性來描述&#xff1a; window.devicePix…

重構筆記系統:Docker Compose在微服務架構中的應用與優化

雖然我的筆記系統的開發是基于微服務的思想&#xff0c;但是在服務的配置和編排上感覺還是不太合理&#xff0c;具體來說&#xff0c;在開發上的配置和在生產上的配置差別太大。現在規模小&#xff0c;后面規模變大&#xff0c;估計這一塊會成為系統生長的瓶頸。 因此&#xff…

【Web】速談FastJson反序列化中BasicDataSource的利用

目錄 關于BCEL BCEL的惡意利用demo FastJson配合BCEL初始化任意類 parse情況下后天精心構造彌補先天之不足 exp 參考文章&#xff1a; BCEL ClassLoader去哪了 Java動態類加載&#xff0c;當FastJson遇到內網 關于BCEL BCEL(Byte Code Engineering Library)的全名是Apa…

跨時鐘信號處理方法

1. 背景 現在的芯片&#xff08;比如SOC&#xff0c;片上系統&#xff09;集成度和復雜度越來越高&#xff0c;通常一顆芯片上會有許多不同的信號工作在不同的時鐘頻率下。比如SOC芯片中的CPU通常會工作在一個頻率上&#xff0c;總線信號&#xff08;比如DRAM BUS&#xff09;會…

python+Django+Neo4j中醫藥知識圖譜與智能問答平臺

文章目錄 項目地址基礎準備正式運行 項目地址 https://github.com/ZhChessOvO/ZeLanChao_KGQA 基礎準備 請確保您的電腦有以下環境&#xff1a;python3&#xff0c;neo4j 在安裝目錄下進入cmd&#xff0c;輸入指令“pip install -r requirement.txt”,安裝需要的python庫 打…

貓為什么挑食?可以改善、預防貓咪挑食的主食凍干分享

現在的貓咪主人都把自家的小貓當成了心頭的寶貝&#xff0c;呵護備至。最令人頭疼的就是貓咪挑食不吃貓糧&#xff0c;貓為什么挑食&#xff1f;遇到這類情況怎么辦呢&#xff1f;今天&#xff0c;我要分享一個既能確保貓咪不受苦&#xff0c;又能有效改善挑食問題的方法。 一、…

vue api封裝

api封裝 由于一個項目里api是很多的&#xff0c;隨處都在調&#xff0c;如果按照之前的寫法&#xff0c;在每個組件中去調api&#xff0c;一旦api有改動&#xff0c;遍地都要去改&#xff0c;所以api應該也要封裝一下&#xff0c;將api的調用封裝在函數中&#xff0c;將函數集…

C++實現簡易版http server

mini服務器簡介 mini服務器功能 1.實現了GET和POST方法的HTTP request和HTTP respond的構建和發送&#xff0c;使服務器可以完成基本通信功能。 2.使用了線程池技術&#xff0c;使服務器可以一次接收更多的鏈接和加快了服務器處理數據的速度。 3.實現了簡易的CGI&#xff0…

【MATLAB源碼-第155期】基于matlab的OFDM系統多徑信道LS,LMMSE,SVD三種估計算法的比較誤碼率對比仿真。

操作環境&#xff1a; MATLAB 2022a 1、算法描述 OFDM&#xff08;Orthogonal Frequency Division Multiplexing&#xff0c;正交頻分復用&#xff09;是一種高效的無線信號傳輸技術&#xff0c;廣泛應用于現代通信系統&#xff0c;如Wi-Fi、LTE和5G。OFDM通過將寬帶信道劃分…

jmeter 按流量階梯式壓測數據庫

當前版本&#xff1a; jmeter 5.6.3mysql 5.7.39 簡介 JMeter 通過 BZM - Arrivals Thread Group 來模擬并發到達的用戶流量、按時間加壓&#xff0c;可以有效地幫助測試人員評估系統在高壓力和高并發情況下的性能表現。 文章目錄如下 1. 下載插件 2. 界面說明 3. 測試步驟…

C#在并發編程使用Frozen來確保線程安全性

在C#中&#xff0c;Frozen方法通常用于通過不可變對象來確保線程安全性。這通常在并發編程中很有用&#xff0c;特別是在共享狀態的多線程環境中。Frozen方法是Caliburn Micro框架中的一個方法&#xff0c;它用于將對象標記為不可變。 當你調用Frozen方法時&#xff0c;它返回…

云計算 2月26號 (進程管理和常用命令)

一、權限擴展 文件權限管理之&#xff1a; 隱藏權限防止root誤刪除 文件屬性添加與查看 [rootlinux-server ~]# touch file1 file2 file3 1.查看文件屬性 [rootlinux-server ~]# lsattr file1 file2 file3 ---------------- file1 ---------------- file2 ---------------- f…

【FAQ】HarmonyOS SDK 閉源開放能力 —Account Kit

1.問題描述 實時驗證和非實時驗證的區別是什么&#xff1f; 解決方案 相同點&#xff1a; “手機號快速驗證”和“實時驗證”都是為了向用戶發起獲取手機號信息的請求。最終目的都是為了獲取到手機號。這兩種獲取方式都需要完成“獲取您的手機號”的Scope權限申請。 區別&…

UDP協議和TCP協議詳解

文章目錄 應用層自定義協議 傳輸層udp協議TCP協議1.確認應答2.超時重傳3.連接管理建立連接, 三次握手斷開連接, 四次揮手tcp的狀態 4.滑動窗口5.流量控制6.擁塞控制7.延時應答8.攜帶應答9.面向字節流10.異常情況 應用層 自定義協議 客戶端和服務器之間往往要進行交互的是“結構…

Eigen-約簡,訪問和廣播

約簡化&#xff0c;訪客和廣播 一、約簡化1. 標準計算2. 布爾約減 二、訪問三、部分約簡1. 將部分約減與其他業務相結合 四、廣播1. 將廣播與其他業務相結合 一、約簡化 在Eigen中&#xff0c;約簡化是一個接受矩陣或數組并返回單個標量值的函數。最常用的約簡方法之一是.sum(…