Go語言基礎知識學習(一)

Go基本數據類型

在這里插入圖片描述

bool

bool型值可以為true或者false,例子:

var b bool = true

數值型

類型表示范圍
int8有符號8位整型-128 ~ 127
int16有符號16位整型-32768 ~ 32767
int32有符號32位整型-2147783648 ~ 2147483647
int64有符號64位整型···
uint8無符號8位整型0 ~ 255
uint16無符號16位整型0 ~ 65535
uint32無符號32位整型0 ~ 4294967295
uint64無符號64位整型···

浮點型

類型表示
float3232位浮點數
float6464位浮點數

其他

類型表示
byteuint8
runeint32

數據類型的轉換

簡單的轉換操作

package mainimport ("fmt""strconv"
)// 類型轉換
func main() {var a int8 = 12var b = uint8(a)var f float32 = 3.14var c = int32(f)fmt.Println(b, c)var f64 = float64(a)fmt.Println(f64)type IT int //類型要求很嚴格var d IT = 13fmt.Println(d)//字符串轉數字var istr = "12a"//字符串轉數字的方法,返回轉換的值和errormint, err := strconv.Atoi(istr)if err != nil {fmt.Println("convert error!")} else {fmt.Println(mint)}var myi = 32//數字轉字符串mstr := strconv.Itoa(myi)fmt.Println(mstr)//字符串轉為float32, 轉換為boolfl, err2 := strconv.ParseFloat("3.1415926", 64)if err2 != nil {return}fmt.Println(fl)//字符串轉為整數parseInt, err3 := strconv.ParseInt("-42", 10, 64)if err3 != nil {return}fmt.Println(parseInt)//字符串轉為boolparseBool, parseBoolErr := strconv.ParseBool("true")if parseBoolErr != nil {return}fmt.Println(parseBool)//基本類型轉為字符串boolStr := strconv.FormatBool(true)fmt.Println(boolStr)//float轉為字符串floatStr := strconv.FormatFloat(3.1415926, 'f', -1, 64)fmt.Println(floatStr)fmt.Println(strconv.FormatInt(42, 16))
}

運算符和表達式

package mainimport "fmt"func main() {// 運算符 + - * / % ++ --var a, b = 1, 2fmt.Println(a + b) //3var astr, bstr = "hello", "zed"fmt.Println(astr + bstr) //hellozed//取余fmt.Println(3 % 2) //1a++fmt.Println(a) //2//邏輯運算符var abool, bbool = true, falsefmt.Println(abool && bbool) //falsefmt.Println(abool || bbool) //truefmt.Println(!abool)         //false//位運算符var A = 60var B = 13fmt.Println(A & B) // 12
}

字符串

格式化輸出

package mainimport ("fmt""strconv""strings"
)func main() {//轉義符courseName := "go\"體系課\""fmt.Println(courseName)//格式化輸出username := "bobby"out := "hello" + username //簡單組裝輸出fmt.Println(out)age := 18address := "北京"fmt.Println("用戶名: " + username + "," + "年齡: " + strconv.Itoa(age) + ",地址: " + address)fmt.Printf("用戶名: %s, 年齡: %d, 地址: %s", username, age, address) //非常常用,性能不好userMsg := fmt.Sprintf("用戶名: %s, 年齡: %d, 地址: %s", username, age, address)fmt.Println(userMsg)//通過string的builder進行字符串拼接,高性能var builder strings.Builderbuilder.WriteString("用戶名: ")builder.WriteString(username)builder.WriteString(", 年齡: ")builder.WriteString(strconv.Itoa(age))builder.WriteString(", 地址: ")builder.WriteString(address)re := builder.String()fmt.Println(re)
}

字符串的比較

package mainimport "fmt"func main() {//字符串的比較a := "hello"b := "hello"fmt.Println(a == b) // true//字符串的大小比較c := "bello"fmt.Println(a > c) //true,比較asic碼的大小
}

字符串的操作方法

package mainimport ("fmt""strings"
)func main() {//字符串的比較a := "hello"b := "hello"fmt.Println(a == b) // true//字符串的大小比較c := "bello"fmt.Println(a > c) //true,比較asic碼的大小//是否包含某字符串name := "goland-工程師"isContains := strings.Contains(name, "goland")fmt.Println(isContains)//查詢字串出現的次數fmt.Println(strings.Count(name, "o")) //1//分割字符串fmt.Println(strings.Split(name, "-")) //[goland 工程師]//字符串是否包含前綴 是否包含后綴fmt.Println(strings.HasPrefix(name, "g")) //truefmt.Println(strings.HasSuffix(name, "g")) //false//查詢字串出現的位置fmt.Println(strings.Index(name, "師")) //14 字節出現的位置//字串替換fmt.Println(strings.Replace(name, "goland", "java", 1))//大小寫轉換fmt.Println(strings.ToLower(name))fmt.Println(strings.ToUpper(name)) // GOLAND//去掉特殊字符串fmt.Println(strings.Trim("hello go   ", " ")) // hello go, 去掉的是左右的所有被指定的字符串}

條件判斷與for循環

條件判斷

package mainimport "fmt"/* if bool表達式 {邏輯
}
*/func main() {//條件判斷age := 22country := "中國"if age < 18 && country == "中國" {fmt.Println("未成年人")} else if age == 18 {fmt.Println("剛好是成年人")} else {fmt.Println("成年人")}}

for循環

package mainimport "fmt"func main() {/*for循環for init; condition; post {邏輯}*/for i := 0; i < 3; i++ {fmt.Println(i)}//打印九九乘法表for i := 1; i <= 9; i++ {for j := 1; j <= i; j++ {fmt.Printf("%d * %d = %d ", i, j, i*j)}fmt.Println()}//for range,主要是對字符串、數組、切片、map、channel的遍歷/**for index, value := range 遍歷的數據 {}1. 如果遍歷的是字符串的話,key為字符串的索引,value字符串對應的縮影的字符的值的拷貝,如果不鞋key,返回的是索引2. 數組: key為數組的索引,value為索引對應的值的拷貝3. 切片: key為切片的索引,value為索引對應的值的拷貝4. map: key為map的key, value為key對應的值的拷貝5. channel:  無key,    value為channel接收的數據*/name := "hello, go"for index, value := range name {//fmt.Println(index, value)fmt.Printf("%d %c\r\n", index, value)}//不想打印index,可以使用匿名變量fmt.Println("----------------------------")for _, value := range name {fmt.Printf("%c\r\n", value)}fmt.Println("----------------------------")for index := range name {fmt.Printf("%c\r\n", name[index])}
}

goto

package mainimport "fmt"/*
*
goto語句可以讓我的代碼跳到指定的代碼塊中運行
很少用
*/
func main() {for i := 0; i < 5; i++ {for j := 0; j < 4; j++ {if j == 2 {goto over}fmt.Println(i, j)}}over:fmt.Println("over")}

switch

package mainimport "fmt"func main() {/*switch val {case val1:...case val2:...default:...}*///中文的星期幾,輸出對應的英文day := "周五"switch day {case "周一":fmt.Println("Mongday")case "周五":fmt.Println("Friday")case "周三":fmt.Println("Wednesday")default:fmt.Println("Saturday")}score := 95switch {case score < 60:fmt.Println("E")case score >= 60 && score < 70:fmt.Println("D")case score >= 70 && score < 80:fmt.Println("C")case score >= 80 && score < 90:fmt.Println("b")case score >= 90 && score <= 100:fmt.Println("A")}switch score {case 60, 70, 80:fmt.Println("牛")default:fmt.Println("牛牛")}
}

Go語言的容器

數組、切片(slice)、map、list

Go–數組

package mainimport "fmt"func main() {/*go語言提供了哪些集合類型的數據結構1、數組2、切片(slice)3、map4、list*/// 數組 定義: var name [count]intvar courses1 [3]string //courses1類型: 只有三個元素的數組類型var courses2 [4]string //courses2類型: 只有四個元素的數組類型fmt.Printf("%T\r\n", courses1)fmt.Printf("%T\r\n", courses2)courses1[0] = "go"courses1[1] = "grpc"courses1[2] = "gin"fmt.Println(courses1)//對數組進行遍歷,indexfor _, value := range courses1 {fmt.Println(value)}
}

Go–Slice切片

package mainimport "fmt"func main() {//go折中var courses []stringfmt.Printf("%T\r\n", courses)courses = append(courses, "Java", "Python", "Golang")fmt.Println(courses)//訪問切片的元素 訪問一個,根據下標訪問 or 訪問多個fmt.Println(courses[2])//訪問多個coursesSlice := []string{"Java", "Go", "mysql", "Kafka", "Redis", "ElasticSearch"}/*courseSlice[start:end] 左閉右開區間,1、如果只有start,沒有end,表示從start開始到結尾的所有數據2、如果沒有start,只有end,表示從0到end之間的所有的數據3、沒有start沒有end就是復制了一份*/fmt.Println(coursesSlice[1:3])fmt.Println(coursesSlice[0:])fmt.Println(coursesSlice[:3])fmt.Println(coursesSlice[:])//切片數據的添加coursesSlice2 := []string{"go", "grpc"}//若想合并兩個切片的數據coursesSlice3 := []string{"python", "kafka"}for _, val := range coursesSlice3 {coursesSlice2 = append(coursesSlice2, val)}coursesSlice2 = append(coursesSlice2, coursesSlice3...)coursesSlice2 = append(coursesSlice2, "gin", "mysql", "es")fmt.Println(coursesSlice2)//如何刪除slice中的元素,利用append函數重新生成slicecoursesSlice4 := []string{"go", "Java", "Python", "MySQL"}newSlice := append(coursesSlice4[:2], coursesSlice4[3:]...)fmt.Println(newSlice)//復制slicecoursesSlice4Copy := coursesSlice4coursesSlice4Copy2 := coursesSlice4[:]fmt.Println(coursesSlice4Copy)fmt.Println(coursesSlice4Copy2)var newCoursesSliceCopy = make([]string, len(coursesSlice4))copy(newCoursesSliceCopy, coursesSlice4)fmt.Println(newCoursesSliceCopy)fmt.Println("--------直接賦值和使用copy函數的區別--------")coursesSlice4[0] = "golang"fmt.Println(coursesSlice4Copy[0])fmt.Println(newCoursesSliceCopy[0])
}

切片在函數參數傳遞時是值傳遞還是引用傳遞

package mainimport ("fmt""strconv"
)func printSlice(data []string) {data[0] = "java"for i := 0; i < 10; i++ {data = append(data, strconv.Itoa(i))}
}func main() {/*go的slice在函數參數傳遞的時候是值傳遞還是引用傳遞?答案是值傳遞,但是效果呈現的是引用的效果(不完全是)這個代碼呈現的結果是,如果是對當前slice進行值的修改,發現改成功了,但是想加數據卻加不了,現象是改數據看起來是引用傳遞了,加數據反而是值傳遞的效果*/courses := []string{"go", "grpc", "gin"}printSlice(courses)fmt.Println(courses)
}

Go容器–map

package mainimport "fmt"func main() {/*map是一個key(索引)和value(值)的無序集合查詢方便O(1)*/var coursesMap = map[string]string{"go":   "golang工程師","grpc": "grpc入門","gin":  "gin深入理解",}fmt.Println(coursesMap["grpc"])//放值coursesMap["mysql"] = "mysql原理"//var nullMap map[string]string //nil, map類型如果想設置值,必須要初始化//nullMap["mysql"] = "mysql原理"//fmt.Println(nullMap)//fmt.Println(coursesMap)var nullMap2 = map[string]string{}nullMap2["mysql"] = "mysql原理"fmt.Println(nullMap2)//使用make函數初始化,make是內置函數,主要用于初始化slice map channelvar nullMap3 = make(map[string]string, 3)nullMap3["mysql"] = "mysql原理"fmt.Println(nullMap3)/*map必須初始化采用使用, 初始化的方法1. map[string]string{}2. make(map[string]string, 3 )3. 但是slice可以不初始化*/var slirceTest []stringif slirceTest == nil {fmt.Println("slirceTest is nil")}slirceTest = append(slirceTest, "a")/**map的兩種賦值方法:1. 初始化的賦值:var coursesMap = map[string]string{"go":   "golang工程師","grpc": "grpc入門","gin":  "gin深入理解",}2. 直接手動賦值:coursesMap["mysql"] = "mysql原理"*///遍歷mapfmt.Println("-------------map的遍歷---------------")for key, value := range coursesMap {fmt.Println(key, value)}fmt.Println("-------------map的遍歷,只打印key---------------")for key := range coursesMap {fmt.Println(key, coursesMap[key])}//map是無序的,并且不保證每次打印是相同的數據fmt.Println("-------------map尋找key不存在的數據---------------")d := coursesMap["java"]fmt.Println(d)if _, ok := coursesMap["java"]; !ok {fmt.Println("not in")} else {fmt.Println("in")}//刪除一個元素delete(coursesMap, "grpc")fmt.Println(coursesMap)delete(coursesMap, "rpc") //刪除不存在的元素也不會報錯//重要提示, map不是線程安全的
}

Go容器 – list(鏈表)

package mainimport ("container/list""fmt"
)func main() {var mylist = list.List{}mylist.PushBack("go")mylist.PushBack("grpc")mylist.PushBack("gin")fmt.Println(mylist)//遍歷打印值,從頭遍歷for i := mylist.Front(); i != nil; i = i.Next() {fmt.Println(i.Value)}fmt.Println("----------反向遍歷----------")//反向遍歷for i := mylist.Back(); i != nil; i = i.Prev() {fmt.Println(i.Value)}fmt.Println("----------初始化list的方法----------")newList := list.New()newList.PushFront("mysql")for i := newList.Front(); i != nil; i = i.Next() {fmt.Println(i.Value)}//插入指定元素之前或者之后fmt.Println("----------插入指定元素之前或者之后----------")i := newList.Front()for ; i != nil; i = i.Next() {if i.Value.(string) == "mysql" {break}}newList.InsertBefore("oracle", i)for i := newList.Front(); i != nil; i = i.Next() {fmt.Println(i.Value)}//list刪除fmt.Println("----------newList刪除----------")newList.Remove(i)for i := newList.Front(); i != nil; i = i.Next() {fmt.Println(i.Value)}
}

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

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

相關文章

優思學院|如何建立公司運營指標體系?如何推行六西格瑪改進運營指標?

關鍵績效指標 (KPI) 是測量您團隊或組織朝重要商業目標進展表現如何的量化指標&#xff0c;組織會在多個層面使用 KPI&#xff0c;這視乎您想要追蹤何指標而定&#xff0c;您可以設定全組織的、特定團隊的、或甚至是個人 KPI。 良好的KPI能讓公司管理者掌握組織的營運是否進度…

使用React 18、Echarts和MUI實現溫度計

關鍵詞 React 18 Echarts和MUI 前言 在本文中&#xff0c;我們將結合使用React 18、Echarts和MUI&#xff08;Material-UI&#xff09;庫&#xff0c;展示如何實現一個交互性的溫度計。我們將使用Echarts繪制溫度計的外觀&#xff0c;并使用MUI創建一個漂亮的用戶界面。 本文…

點評項目——分布式鎖

2023.12.10 集群模式下的并發安全問題及解決 隨著現在分布式系統越來越普及&#xff0c;一個應用往往會部署在多臺機器上&#xff08;多節點&#xff09;&#xff0c;通過加鎖可以解決在單機情況下的一人一單安全問題&#xff0c;但是在集群模式下就不行了。見下圖&#xff1a…

在 Android WebView 中實現和 JavaScript 的互操作

前言 在 APP 中內嵌一個 H5 來實現特定的業務功能已經是非常成熟且常用的方案了。 雖然 H5 已經能夠實現大多數的需求&#xff0c;但是對于某些需求還是得依靠原生代碼來實現然后與 JavaScript 進行交互&#xff0c;例如我目前所負責的項目就是一個 “智能硬件” 設備&#x…

【PyTorch】卷積神經網絡

文章目錄 1. 理論介紹1.1. 從全連接層到卷積層1.1.1. 背景1.1.2. 從全連接層推導出卷積層 1.2. 卷積層1.2.1. 圖像卷積1.2.2. 填充和步幅1.2.3. 多通道 1.3. 池化層&#xff08;又稱匯聚層&#xff09;1.3.1. 背景1.3.2. 池化運算1.3.3. 填充和步幅1.3.4. 多通道 1.4. 卷積神經…

實現React18加TS,解決通用后臺管理系統,實戰方案落地有效實踐經驗

隨著前端技術的不斷發展和更新&#xff0c;使用React 18結合TypeScript&#xff08;TS&#xff09;來構建通用后臺管理系統已成為一種常見的選擇。本文將介紹如何在項目中應用React 18和TS&#xff0c;并分享一些實戰方案的有效實踐經驗。 一、搭建React 18 TS項目 首先&…

12.2每日一題(1無窮型冪指函數:二倍角公式+三部曲+等價無窮小代換(只有整體的因子不為0才能先算出來))

注意&#xff1a;求極限不能想先算哪里就先算哪里&#xff0c;只有整體的因子不為0才能先算出來&#xff0c;部分不為0不可以先算

外貿老業務也棘手的一個問題

這幾天有2個老業務都被一個類同的問題纏住了。 客戶定購了三臺車&#xff0c;由于是非常規要求所以我建議收取全款或者最少收50%的定金。但是業務員為了當月業績或者為了拿到就收了客戶20% 或者30% &#xff0c;定金收到了&#xff0c;我也不好再逼著業務員去加收定金。 訂單就…

記錄 | ubuntu上安裝fzf

在 ubuntu 上采用命令行安裝 fzf 的方式行不通 指的是采用下面的方式行不通&#xff1a; sudo apt install fzf # 行不通 sudo snap install fzf --classic # 行不通正確的安裝方式是&#xff1a; ● 到 fzf 的 git 倉庫&#xff1a;https://github.com/junegunn/fzf/re…

在高數據量中如何優化MySQL的Group by語句?

在實際開發環境中&#xff0c;MySQL的GROUP BY操作的優化需要結合具體的業務場景和數據特點。以下是一些建議&#xff0c;可以幫助你在實際開發中優化GROUP BY查詢&#xff1a; 使用合適的索引&#xff1a; 確保GROUP BY和ORDER BY中的列上存在索引。這有助于加速分組和排序操作…

計算機畢業設計 基于SpringBoot的電動車租賃系統的設計與實現 Java實戰項目 附源碼+文檔+視頻講解

博主介紹&#xff1a;?從事軟件開發10年之余&#xff0c;專注于Java技術領域、Python人工智能及數據挖掘、小程序項目開發和Android項目開發等。CSDN、掘金、華為云、InfoQ、阿里云等平臺優質作者? &#x1f345;文末獲取源碼聯系&#x1f345; &#x1f447;&#x1f3fb; 精…

場景示例:有贊商城 × 微盛企微管家,助力零售企業,實現私域運營自動化

1 場景描述 在零售行業內&#xff0c;線上渠道已經是零售行業的主要銷售渠道&#xff0c;大多數零售企業都會將產品上架到有贊商城&#xff0c;并使用微盛企微管家系統進行客戶管理和服務&#xff0c;希望能對客戶畫像進行精細化管理&#xff0c;以提升銷售和服務效率。 然而&a…

2023年最新prometheus + grafana搭建和使用+gmail郵箱告警配置

一、安裝prometheus 1.1 安裝 prometheus官網下載地址 sudo -i mkdir -p /opt/prometheus #移動解壓后的文件名到/opt/,并改名prometheus mv prometheus-2.45 /opt/prometheus/ #創建一個專門的prometheus用戶&#xff1a; -M 不創建家目錄&#xff0c; -s 不讓登錄 useradd…

女士內衣市場分析:預計2028年將達到643.08億美元

內衣 (英文名:Underwear)&#xff0c;是指貼身穿的衣物。內衣有保暖及污穢的危害作用&#xff0c;有時會被視為性征。女士內衣行業生產的主要原料是各類織布或無紡布&#xff0c;成分有海綿、邊、定型紗、骨膠、肩帶等&#xff0c;布面料在內衣企業的生產成本中所占比重較大。女…

Python基礎(四、探索迷宮游戲)

Python基礎&#xff08;四、探索迷宮游戲&#xff09; 游戲介紹游戲說明 游戲介紹 在這個游戲中&#xff0c;你將扮演一個勇敢的冒險者&#xff0c;進入了一個神秘的迷宮。你的任務是探索迷宮的每個房間&#xff0c;并最終找到隱藏在其中的寶藏。 游戲通過命令行界面進行交互…

web 前端之標簽練習+知識點

目錄 實現過程&#xff1a; 結果顯示 1、HTML語法 2、注釋標簽 3、常用標簽 4、新標簽 5、特殊標簽 6、在網頁中使用視頻和音頻、圖片 7、表格標簽 8、超鏈接標簽 使用HTML語言來實現該頁面 實現過程&#xff1a; <!DOCTYPE html> <html><head>…

泡沫包裝市場分析:預計2029年將達到659億元

泡沫包裝&#xff0c;簡單地講&#xff0c;就是用數學方法對無線電測量或光學測量所獲得的彈道數據進行檢驗、整理、校正、計算&#xff0c;減小或消除數據的誤差&#xff0c;得出反映運載火箭運動軌跡的精確彈道參數。通常所說的泡沫包裝&#xff0c;主要是指由可發性聚苯乙烯…

面試操作系統八股文五問五答第二期

面試操作系統八股文五問五答第二期 作者&#xff1a;程序員小白條&#xff0c;個人博客 相信看了本文后&#xff0c;對你的面試是有一定幫助的&#xff01; ?點贊?收藏?不迷路&#xff01;? 1.怎么解決死鎖&#xff1f; 1、預防死鎖&#xff1a;通過設置一些限制條件&am…

JAVA面試題8

1.Java中的線程是什么&#xff1f; 它有什么作用&#xff1f; 答案&#xff1a;線程是程序執行流的最小單位&#xff0c;用于實現多任務并發執行。Java中的線程可以實現并發編程&#xff0c;提高程序的性能和響應性。 2.什么是Java中的同步&#xff08;Synchronization&#x…

超靜音的兩相步進電機驅動芯片GC6609,GC6610的性能分析

兩相步進電機驅動芯片GC6609&#xff0c;GC6610它們是一款超靜音的兩相步進電機驅動芯片&#xff0c;內置最大 256 細分的步進驅動模式&#xff0c; 超靜音&#xff0c;低振動。芯片可以工作在 4~36V 的寬工作電壓范圍內&#xff0c;平均工作電流可以達到 2A和2.5A &#xff0c…