GoLang語言

基礎

安裝Go擴展

go build

在項目目錄下執行go build

go run

像執行腳本文件一樣執行Go代碼

go install

go install分為兩步:

1、?先編譯得到一個可執行文件

2、將可執行文件拷貝到GOPATH/bin

Go 命令

go build :編譯Go程序

go build -o "xx.exe" :編譯成xx.exe文件

go run main.go: 像執行腳本一樣執行main.go文件

go install: 先編譯后拷貝

變量

3種聲明方式:

  1. var name1 string

  2. var name2 = "沙河娜扎"

  3. 函數內部專屬:name3:="沙河小王子"

常量

const PI = 3.1415926

const UserNotExistErr = 10000

iota:實現枚舉

兩個要點:

  1. iota在const關鍵字出現時將被重置為0

  2. const中每新增一行常量聲明,iota累加1

基本數據類型

整型

無符號整型:uint8uint16uint32uint64

帶符號整型:int8int16int32int64

uintint:具體是32位還是64位看操作系統

uintptr:表示指針

浮點型

float64float32

Go語言中浮點數默認是float64

復數

complex128complex64

布爾值

truefalse

不能和其他的類型做轉換

字符串

常用方法

字符串不能修改

byte和rune類型

都屬于類型別名

復合數據類型

????????數組

數組的聲明

// 數組是存放元素的容器
// 必須指定存放的元素的類型和容量(長度)
// 數組的長度是數組類型的一部分
var a1 [3]bool // [true false true]
var a2 [4]bool // [true true false false]

fmt.Printf("a1:%T a2:%T\n", a1, a2)

數組的初始化

// 數組的初始化
// 如果不初始化:默認元素都是零值(布爾值:false, 整型和浮點型都是0, 字符串:"")
fmt.Println(a1, a2)
// 1. 初始化方式1
a1 = [3]bool{true, true, true}
fmt.Println(a1)
// 2. 初始化方式2:根據初始值自動推斷數組的長度是多少
// a10 := [9]int{0, 1, 2, 3, 4, 4, 5, 6, 7}
a10 := [...]int{0, 1, 2, 3, 4, 4, 5, 6, 7}
fmt.Println(a10)
// 3. 初始化方式3:根據索引來初始化
a3 := [5]int{0: 1, 4: 2}
fmt.Println(a3)

數組的遍歷

// 數組的遍歷
citys := [...]string{"北京", "上海", "深圳"} // 索引:0~2 citys[0],citys[1],citys[2]
// 1. 根據索引遍歷
for i := 0; i < len(citys); i++ {
?? ?fmt.Println(citys[i])
}
// 2. for range遍歷
for i, v := range citys {
?? ?fmt.Println(i, v)
}

二維數組

// 多維數組
// [[1 2] [3 4] [5 6]]
var a11 [3][2]int
a11 = [3][2]int{
?? ?[2]int{1, 2},
?? ?[2]int{3, 4},
?? ?[2]int{5, 6},
}
fmt.Println(a11)

// 多維數組的遍歷
for _, v1 := range a11 {
?? ?fmt.Println(v1)
?? ?for _, v2 := range v1 {
?? ??? ?fmt.Println(v2)
?? ?}
}

數組是值類型

// 數組是值類型
b1 := [3]int{1, 2, 3} // [1 2 3]
b2 := b1 ? ? ? ? ? ? ?// [1 2 3] Ctrl+C Ctrl+V => 把world文檔從文件夾A拷貝到文件夾B
b2[0] = 100 ? ? ? ? ? // b2:[100 2 3]
fmt.Println(b1, b2) ? // b1:[1 2?

切片(slice)

切片指向了一個底層的數組。

切片的長度就是它元素的個數。

切片的容量是底層數組從切片的第一個元素到最后一個元素的數量。

切片的定義

// 切片的定義
var s1 []int ? ?// 定義一個存放int類型元素的切片
var s2 []string // 定義一個存放string類型元素的切片
fmt.Println(s1, s2)
fmt.Println(s1 == nil) // true
fmt.Println(s2 == nil) // true

切片的初始化

// 初始化
s1 = []int{1, 2, 3}
s2 = []string{"沙河", "張江", "平山村"}
fmt.Println(s1, s2)
fmt.Println(s1 == nil) // false
fmt.Println(s2 == nil) // false

切片的長度和容量

// 長度和容量
fmt.Printf("len(s1):%d cap(s1):%d\n", len(s1), cap(s1))
fmt.Printf("len(s2):%d cap(s2):%d\n", len(s2), cap(s2)

make

make()函數用于創建指定長度和容量的切片。

s1 := make([]int, 5, 10)
fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n", s1, len(s1), cap(s1))

s2 := make([]int, 0, 10)
fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n", s2, len(s2), cap(s2))

切片的本質

切片就是一個框,框住了一塊連續的內存。

切片屬于引用類型,真正的數據都是保存在底層數組里的。

判斷一個切片是否是空的,要是用len(s) == 0來判斷

append

// 調用append函數必須用原來的切片變量接收返回值
// append追加元素,原來的底層數組放不下的時候,Go底層就會把底層數組換一個
// 必須用變量接收append的返回值
s1 = append(s1, "廣州")
fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n", s1, len(s1), cap(s1))
s1 = append(s1, "杭州", "成都")
fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n", s1, len(s1), cap(s1))
ss := []string{"武漢", "西安", "蘇州"}
s1 = append(s1, ss...) // ...表示拆開
fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n", s1, len(s1), cap(s1))

copy

a1 := []int{1, 3, 5}
a2 := a1 // 賦值
var a3 = make([]int, 3, 3)
copy(a3, a1) // copy
fmt.Println(a1, a2, a3)
a1[0] = 100
fmt.Println(a1, a2, a3)

指針

Go語言中不存在指針操作,只需要記住兩個符號:

  1. &:取地址

  2. *:根據地址取值

make和new的區別

  1. make和new都是用來申請內存的

  2. new很少用,一般用來給基本數據類型申請內存,stringint,返回的是對應類型的指針(*string、*int)。

  3. make是用來給slicemapchan申請內存的,make函數返回的的是對應的這三個類型本身

map

map也是引用類型,必須初始化之后才能使用。

func main() {
?? ?var m1 map[string]int
?? ?fmt.Println(m1 == nil) ? ? ? ?// 還沒有初始化(沒有在內存中開辟空間)
?? ?m1 = make(map[string]int, 10) // 要估算好該map容量,避免在程序運行期間再動態擴容
?? ?m1["理想"] = 18
?? ?m1["jiwuming"] = 35

?? ?fmt.Println(m1)
?? ?fmt.Println(m1["理想"])
?? ?// 約定成俗用ok接收返回的布爾值
?? ?fmt.Println(m1["娜扎"]) // 如果不存在這個key拿到對應值類型的零值
?? ?value, ok := m1["娜扎"]
?? ?if !ok {
?? ??? ?fmt.Println("查無此key")
?? ?} else {
?? ??? ?fmt.Println(value)
?? ?}

?? ?// map的遍歷
?? ?for k, v := range m1 {
?? ??? ?fmt.Println(k, v)
?? ?}
?? ?// 只遍歷key
?? ?for k := range m1 {
?? ??? ?fmt.Println(k)
?? ?}
?? ?// 只遍歷value
?? ?for _, v := range m1 {
?? ??? ?fmt.Println(v)
?? ?}
?? ?// 刪除
?? ?delete(m1, "jiwuming")
?? ?fmt.Println(m1)
?? ?delete(m1, "沙河") // 刪除不存在的key
}

函數

// 函數

// 函數存在的意義?
// 函數是一段代碼的封裝
// 把一段邏輯抽象出來封裝到一個函數中,給它起個名字,每次用到它的時候直接用函數名調用就可以了
// 使用函數能夠讓代碼結構更清晰、更簡潔。

// 函數的定義
func sum(x int, y int) (ret int) {
?? ?return x + y
}

// 沒有返回值
func f1(x int, y int) {
?? ?fmt.Println(x + y)
}

// 沒有參數沒有返回值
func f2() {
?? ?fmt.Println("f2")
}

// 沒有參數但有返回值的
func f3() int {
?? ?ret := 3
?? ?return ret
}

// 返回值可以命名也可以不命名

// 命名的返回值就相當于在函數中聲明一個變量
func f4(x int, y int) (ret int) {
?? ?ret = x + y
?? ?return // 使用命名返回值可以return后省略
}

// 多個返回值
func f5() (int, string) {
?? ?return 1, "沙河"
}

// 參數的類型簡寫:
// 當參數中連續多個參數的類型一致時,我們可以將非最后一個參數的類型省略
func f6(x, y, z int, m, n string, i, j bool) int {
?? ?return x + y
}

// 可變長參數
// 可變長參數必須放在函數參數的最后
func f7(x string, y ...int) {
?? ?fmt.Println(x)
?? ?fmt.Println(y) // y的類型是切片 []int
}

// Go語言中函數沒有默認參數這個概念

func main() {
?? ?r := sum(1, 2)
?? ?fmt.Println(r)

?? ?_, n := f5()
?? ?fmt.Println(n)

?? ?f7("下雨了")
?? ?f7("下雨了", 1, 2, 3, 4, 5, 6, 7)
}

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

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

相關文章

CSS元素之間的空白問題:原因與解決方案

在網頁設計中&#xff0c;CSS元素之間的空白是一個常見但往往不易察覺的問題。空白不僅影響布局的準確性&#xff0c;還可能破壞設計的整體美感。本文將探討元素之間空白的產生原因&#xff0c;并提供有效的解決方案。 空白產生的根源 空白問題主要發生在行內元素和行內塊元素…

4.x86游戲實戰-人物狀態標志位

免責聲明&#xff1a;內容僅供學習參考&#xff0c;請合法利用知識&#xff0c;禁止進行違法犯罪活動&#xff01; 本次游戲沒法給 內容參考于&#xff1a;微塵網絡安全 上一個內容&#xff1a;3.x86游戲實戰-寄存器 人物狀態標志位&#xff1a; 什么叫人物狀態標志位&…

力扣刷題--3168. 候診室中的最少椅子數【簡單】

題目描述 給你一個字符串 s&#xff0c;模擬每秒鐘的事件 i&#xff1a; 如果 s[i] ‘E’&#xff0c;表示有一位顧客進入候診室并占用一把椅子。 如果 s[i] ‘L’&#xff0c;表示有一位顧客離開候診室&#xff0c;從而釋放一把椅子。 返回保證每位進入候診室的顧客都能有…

Leetcode[反轉鏈表]

LCR 024. 反轉鏈表 給定單鏈表的頭節點 head &#xff0c;請反轉鏈表&#xff0c;并返回反轉后的鏈表的頭節點。 示例 1&#xff1a; 輸入&#xff1a;head [1,2,3,4,5] 輸出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 輸入&#xff1a;head [1,2] 輸出&#xff1a;[2,1]示…

Go使用Gin框架開發的Web程序部署在Linux時,無法綁定監聽Ipv4端口

最近有寫一部分go語言開發的程序&#xff0c;在部署程序時發現&#xff0c;程序在啟動后并沒有綁定ipv4的端口&#xff0c;而是直接監聽綁定ipv6的端口。 當我用netstat -antup | grep 3601查找我的gin服務啟動的端口占用情況的時候發現&#xff0c;我的服務直接綁定了tcp6 &a…

240629_昇思學習打卡-Day11-Vision Transformer中的self-Attention

240629_昇思學習打卡-Day11-Transformer中的self-Attention 根據昇思課程順序來看呢&#xff0c;今兒應該看Vision Transformer圖像分類這里了&#xff0c;但是大概看了一下官方api&#xff0c;發現我還是太笨了&#xff0c;看不太明白。正巧昨天學SSD的時候不是參考了太陽花的…

LeetCode.30 串聯所有單詞的子串

問題描述 給定一個字符串 s 和一個字符串數組 words。 words 中所有字符串 長度相同。 s 中的 串聯子串 是指一個包含 words 中所有字符串以任意順序排列連接起來的子串。 例如&#xff0c;如果 words ["ab","cd","ef"]&#xff0c; 那么 &q…

MySQL Workbench支持哪些數據庫版本的連接?

MySQL Workbench支持哪些數據庫版本的連接&#xff1f; MySQL Workbench 是一款強大的數據庫管理和設計工具&#xff0c;它支持連接多種版本的 MySQL 數據庫。包括但不限于&#xff1a; MySQL 官方發行的所有版本&#xff0c;從 MySQL 5.0 到最新的 MySQL 8.x 和更高版本。 M…

Linux - 札記 - W10: Warning: Changing a readonly file

Linux - 札記 - W10: Warning: Changing a readonly file 這里寫目錄標題 一、問題描述1. 現象2. 原因 二、解決方案 一、問題描述 1. 現象 在使用 vim 編輯文件時&#xff08;我這里是要編輯 /root/.ssh/authorized_keys&#xff09;提示&#xff1a;W10: Warning: Changing…

【論文+代碼|已完結】基于人工智能的圖像識別技術在醫療診斷中的應用

基于人工智能的圖像識別技術在醫療診斷中的應用 摘要&#xff1a;隨著人工智能技術的飛速發展&#xff0c;圖像識別技術在醫療領域的應用日益廣泛。本畢業設計旨在研究基于人工智能的圖像識別技術在醫療診斷中的應用&#xff0c;通過對大量醫療圖像數據的分析和處理&#xff0…

IOS Swift 從入門到精通:ios 連接數據庫 安裝 Firebase 和 Firestore

創建 Firebase 項目 導航到Firebase 控制臺并創建一個新項目。為項目指定任意名稱。 在這里插入圖片描述 下一步,啟用 Google Analytics,因為我們稍后會用到它來發送推送通知。 在這里插入圖片描述 在下一個屏幕上,選擇您的 Google Analytics 帳戶(如果已創建)。如果沒…

<電力行業> - 《第7課:發電》

1 發電的原理 電力生產的發電環節是利用電能生產設備將各種一次能源或其他形式的能轉換為電能。生產電能的主要方式有火力發電、水力發電、核能發電、地熱發電、風力發電、太陽能發電、潮汐能發電、生物智能發電和燃料電池發電等。 除太陽能發電的光伏電池技術和燃料電池發電…

c++ 子類繼承父類

這個是子類繼承父類 是否重寫從父類那里繼承來的函數 這個例子的路徑 E盤 demo文件夾 fatherChildfunc

藍卓出席“2024C?O大會”,探討智能工廠建設新路徑

6月29日&#xff0c;“2024C?O大會”在金華成功舉辦。此次大會由浙江省企業信息化促進會主辦&#xff0c;與以往CIO峰會不同&#xff0c;“C?O”代表了企業數字化中的核心決策者群體&#xff0c;包括傳統的CIO、CEO、CDO等。 本次大會圍繞C?O、AIGC與制造業、數據價值、未來…

統計信號處理基礎 習題解答11-9

一個飛行器開始于一個未知位置(, )&#xff0c;按照 以常速運動&#xff0c;其中, 分別是飛行器在x、y方向的速度分量,都是未知的。我們希望估計每一時刻, 飛行器的位置和速度。盡管初始位置(, )和速度, 都是未知的,但是它們可以看成一個隨機矢量。證明能夠由MMSE估計器估計為 …

libarclite_iphonesimulator.a‘; try increasing the minimum deployment target

1. Xcode 15 編譯出現以下錯誤 clang: error: SDK does not contain libarclite at the path /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphonesimulator.a; try increasing the minimum deployment ta…

React+TS前臺項目實戰(二十一)-- Search業務組件封裝實現全局搜索

文章目錄 前言一、Search組件封裝1. 效果展示2. 功能分析3. 代碼詳細注釋4. 使用方式 二、搜索結果展示組件封裝1. 功能分析2. 代碼詳細注釋 三、引用到文件&#xff0c;自行取用總結 前言 今天&#xff0c;我們來封裝一個業務靈巧的組件&#xff0c;它集成了全局搜索和展示搜…

spring如何給bean動態取不同的別名

開源項目SDK&#xff1a;https://github.com/mingyang66/spring-parent 個人文檔&#xff1a;https://mingyang66.github.io/raccoon-docs/#/ spring、springboot向容器中注入bean的時候一般情況下只有一個別名&#xff0c;在某些特殊場景需要指定多個別名。 方案一&#xff1a…

v-if 和 v-show 的含義、使用方式及使用時的區別

學習內容&#xff1a; v-if 和 v-show 的含義、使用方式及使用時的區別&#xff1a; 例如&#xff1a; v-if 的含義v-if 的用法v-show 的含義v-show 的用法v-if 與 v-show 區別 知識小結&#xff1a; 小結 1、v-if v-if 是一種條件性地渲染元素的指令。當條件為真時&#…

ic基礎|功耗篇04:門級低功耗技術

大家好&#xff0c;我是數字小熊餅干&#xff0c;一個練習時長兩年半的IC打工人。我在兩年前通過自學跨行社招加入了IC行業。現在我打算將這兩年的工作經驗和當初面試時最常問的一些問題進行總結&#xff0c;并通過匯總成文章的形式進行輸出&#xff0c;相信無論你是在職的還是…