GO是編譯性語言,所以函數的順序是無關緊要的,為了方便閱讀,建議入口函數 main 寫在最前面,其余函數按照功能需要進行排列
成都創新互聯專注于企業營銷型網站建設、網站重做改版、海陵網站定制設計、自適應品牌網站建設、H5建站、電子商務商城網站建設、集團公司官網建設、外貿網站建設、高端網站制作、響應式網頁設計等建站業務,價格優惠性價比高,為海陵等各大城市提供網站開發制作服務。
GO的函數 不支持嵌套,重載和默認參數
GO的函數 支持 無需聲明變量,可變長度,多返回值,匿名,閉包等
GO的函數用 func 來聲明,且左大括號 { 不能另起一行
一個簡單的示例:
輸出為:
參數:可以傳0個或多個值來供自己用
返回:通過用 return 來進行返回
輸出為:
上面就是一個典型的多參數傳遞與多返回值
對例子的說明:
按值傳遞:是對某個變量進行復制,不能更改原變量的值
引用傳遞:相當于按指針傳遞,可以同時改變原來的值,并且消耗的內存會更少,只有4或8個字節的消耗
在上例中,返回值 (d int, e int, f int) { 是進行了命名,如果不想命名可以寫成 (int,int,int){ ,返回的結果都是一樣的,但要注意:
當返回了多個值,我們某些變量不想要,或實際用不到,我們可以使用 _ 來補位,例如上例的返回我們可以寫成 d,_,f := test(a,b,c) ,我們不想要中間的返回值,可以以這種形式來舍棄掉
在參數后面以 變量 ... type 這種形式的,我們就要以判斷出這是一個可變長度的參數
輸出為:
在上例中, strs ...string 中, strs 的實際值是b,c,d,e,這就是一個最簡單的傳遞可變長度的參數的例子,更多一些演變的形式,都非常類似
在GO中 defer 關鍵字非常重要,相當于面相對像中的析構函數,也就是在某個函數執行完成后,GO會自動這個;
如果在多層循環中函數里,都定義了 defer ,那么它的執行順序是先進后出;
當某個函數出現嚴重錯誤時, defer 也會被調用
輸出為
這是一個最簡單的測試了,當然還有更復雜的調用,比如調試程序時,判斷是哪個函數出了問題,完全可以根據 defer 打印出來的內容來進行判斷,非常快速,這種留給你們去實現
一個函數在函數體內自己調用自己我們稱之為遞歸函數,在做遞歸調用時,經常會將內存給占滿,這是非常要注意的,常用的比如,快速排序就是用的遞歸調用
本篇重點介紹了GO函數(func)的聲明與使用,下一篇將介紹GO的結構 struct
因為char *strings[]不是指針而是指針數組,那么
temp = strings[top];
strings[top] = strings[seek];
strings[seek] = temp;
這種交換交換的就是主調函數中的數組中的指針,把指向字符串的指針順序改變了,當然按次序輸出就達到排序目的了……
這是初始化的語法規定而已
其他語言也是類似的
{
1: "gd",
2: "rew",
} 這樣相當于一個匿名的字典
在python里面,比如
d = {'a':1}
和
d = {}
d['a']=1
是等效
Go語言標準庫中提供了sort包對整型,浮點型,字符串型切片進行排序,檢查一個切片是否排好序,使用二分法搜索函數在一個有序切片中搜索一個元素等功能。
關于sort包內的函數說明與使用,請查看
在這里簡單講幾個sort包中常用的函數
在Go語言中,對字符串的排序都是按照字節排序,也就是說在對字符串排序時是區分大小寫的。
二分搜索算法
Go語言中提供了一個使用二分搜索算法的sort.Search(size,fn)方法:每次只需要比較㏒?n個元素,其中n為切片中元素的總數。
sort.Search(size,fn)函數接受兩個參數:所處理的切片的長度和一個將目標元素與有序切片的元素相比較的函數,該函數是一個閉包,如果該有序切片是升序排列,那么在判斷時使用 有序切片的元素 = 目標元素。該函數返回一個int值,表示與目標元素相同的切片元素的索引。
在切片中查找出某個與目標字符串相同的元素索引
、數組
與其他大多數語言類似,Go語言的數組也是一個元素類型相同的定長的序列。
(1)數組的創建。
數組有3種創建方式:[length]Type 、[N]Type{value1, value2, ... , valueN}、[...]Type{value1, value2, ... , valueN} 如下:
復制代碼代碼如下:
func test5() {
var iarray1 [5]int32
var iarray2 [5]int32 = [5]int32{1, 2, 3, 4, 5}
iarray3 := [5]int32{1, 2, 3, 4, 5}
iarray4 := [5]int32{6, 7, 8, 9, 10}
iarray5 := [...]int32{11, 12, 13, 14, 15}
iarray6 := [4][4]int32{{1}, {1, 2}, {1, 2, 3}}
fmt.Println(iarray1)
fmt.Println(iarray2)
fmt.Println(iarray3)
fmt.Println(iarray4)
fmt.Println(iarray5)
fmt.Println(iarray6)
}
結果:
[0 0 0 0 0]
[1 2 3 4 5]
[1 2 3 4 5]
[6 7 8 9 10]
[11 12 13 14 15]
[[1 0 0 0] [1 2 0 0] [1 2 3 0] [0 0 0 0]]
我們看數組 iarray1,只聲明,并未賦值,Go語言幫我們自動賦值為0。再看 iarray2 和 iarray3 ,我們可以看到,Go語言的聲明,可以表明類型,也可以不表明類型,var iarray3 = [5]int32{1, 2, 3, 4, 5} 也是完全沒問題的。
(2)數組的容量和長度是一樣的。cap() 函數和 len() 函數均輸出數組的容量(即長度)。如:
復制代碼代碼如下:
func test6() {
iarray4 := [5]int32{6, 7, 8, 9, 10}
fmt.Println(len(iarray4))
fmt.Println(cap(iarray4))
}
輸出都是5。
(3)使用:
復制代碼代碼如下:
func test7() {
iarray7 := [5]string{"aaa", `bb`, "可以啦", "叫我說什么好", "()"}
fmt.Println(iarray7)
for i := range iarray7 {
fmt.Println(iarray7[i])
}
}
二、切片
Go語言中,切片是長度可變、容量固定的相同的元素序列。Go語言的切片本質是一個數組。容量固定是因為數組的長度是固定的,切片的容量即隱藏數組的長度。長度可變指的是在數組長度的范圍內可變。
(1)切片的創建。
切片的創建有4種方式:
1)make ( []Type ,length, capacity )
2) make ( []Type, length)
3) []Type{}
4) []Type{value1 , value2 , ... , valueN }
從3)、4)可見,創建切片跟創建數組唯一的區別在于 Type 前的“ [] ”中是否有數字,為空,則代表切片,否則則代表數組。因為切片是長度可變的。如下是創建切片的示例:
復制代碼代碼如下:
func test8() {
slice1 := make([]int32, 5, 8)
slice2 := make([]int32, 9)
slice3 := []int32{}
slice4 := []int32{1, 2, 3, 4, 5}
fmt.Println(slice1)
fmt.Println(slice2)
fmt.Println(slice3)
fmt.Println(slice4)
}
輸出為:
[0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[]
[1 2 3 4 5]
如上,創造了4個切片,3個空切片,一個有值的切片。
(2)切片與隱藏數組:
一個切片是一個隱藏數組的引用,并且對于該切片的切片也引用同一個數組。如下示例,創建了一個切片slice0,并根據這個切片創建了2個切片 slice1 和 slice2:
復制代碼代碼如下:
func test9() {
slice0 := []string{"a", "b", "c", "d", "e"}
slice1 := slice0[2 : len(slice0)-1]
slice2 := slice0[:3]
fmt.Println(slice0, slice1, slice2)
slice2[2] = "8"
fmt.Println(slice0, slice1, slice2)
}
輸出為:
[a b c d e] [c d] [a b c]
[a b 8 d e] [8 d] [a b 8]
可見,切片slice0 、 slice1 和 slice2是同一個底層數組的引用,所以slice2改變了,其他兩個都會變。
(3)遍歷、修改切片:
復制代碼代碼如下:
func test10() {
slice0 := []string{"a", "b", "c", "d", "e"}
fmt.Println("\n~~~~~~元素遍歷~~~~~~")
for _, ele := range slice0 {
fmt.Print(ele, " ")
ele = "7"
}
fmt.Println("\n~~~~~~索引遍歷~~~~~~")
for index := range slice0 {
fmt.Print(slice0[index], " ")
}
fmt.Println("\n~~~~~~元素索引共同使用~~~~~~")
for index, ele := range slice0 {
fmt.Print(ele, slice0[index], " ")
}
fmt.Println("\n~~~~~~修改~~~~~~")
for index := range slice0 {
slice0[index] = "9"
}
fmt.Println(slice0)
}
如上,前三種循環使用了不同的for range循環,當for后面,range前面有2個元素時,第一個元素代表索引,第二個元素代表元素值,使用 “_” 則表示忽略,因為go語言中,未使用的值會導致編譯錯誤。
只有一個元素時,該元素代表索引。
只有用索引才能修改元素。如在第一個遍歷中,賦值ele為7,結果沒有作用。因為在元素遍歷中,ele是值傳遞,ele是該切片元素的副本,修改它不會影響原本值,而在第四個遍歷——索引遍歷中,修改的是該切片元素引用的值,所以可以修改。
結果為:
~~~~~~元素遍歷~~~~~~
a b c d e
~~~~~~索引遍歷~~~~~~
a b c d e
~~~~~~元素索引共同使用~~~~~~
aa bb cc dd ee
~~~~~~修改~~~~~~
[9 9 9 9 9]
(4)、追加、復制切片:
復制代碼代碼如下:
func test11() {
slice := []int32{}
fmt.Printf("slice的長度為:%d,slice為:%v\n", len(slice), slice)
slice = append(slice, 12, 11, 10, 9)
fmt.Printf("追加后,slice的長度為:%d,slice為:%v\n", len(slice), slice)
slicecp := make([]int32, (len(slice)))
fmt.Printf("slicecp的長度為:%d,slicecp為:%v\n", len(slicecp), slicecp)
copy(slicecp, slice)
fmt.Printf("復制賦值后,slicecp的長度為:%d,slicecp為:%v\n", len(slicecp), slicecp)
}
追加、復制切片,用的是內置函數append和copy,copy函數返回的是最后所復制的元素的數量。
(5)、內置函數append
內置函數append可以向一個切片后追加一個或多個同類型的其他值。如果追加的元素數量超過了原切片容量,那么最后返回的是一個全新數組中的全新切片。如果沒有超過,那么最后返回的是原數組中的全新切片。無論如何,append對原切片無任何影響。如下示例:
復制代碼代碼如下:
func test12() {
slice := []int32{1, 2, 3, 4, 5, 6}
slice2 := slice[:2]
_ = append(slice2, 50, 60, 70, 80, 90)
fmt.Printf("slice為:%v\n", slice)
fmt.Printf("操作的切片:%v\n", slice2)
_ = append(slice2, 50, 60)
fmt.Printf("slice為:%v\n", slice)
fmt.Printf("操作的切片:%v\n", slice2)
}
如上,append方法用了2次,結果返回的結果完全不同,原因是第二次append方法追加的元素數量沒有超過 slice 的容量。而無論怎樣,原切片slice2都無影響。結果:
slice為:[1 2 3 4 5 6]
操作的切片:[1 2]
slice為:[1 2 50 60 5 6]
操作的切片:[1 2]
數組是一個由 固定長度 的 特定類型元素 組成的序列,一個數組可以由零個或多個元素組成。 數組是值類型
數組的每個元素都可以通過索引下標來訪問,索引下標的范圍是從0開始到數組長度減1的位置,內置函數 len() 可以返回數組中元素的個數。
2.類型的打印,結果的第二種打印方式
3.對元素的修改或者賦值
4.判斷數組是否相等:長度、類型
4.數組的地址:連續存儲的空間
5.數組的賦值、地址、取值
6.數組的默認值
7.數組的初始化
8.數組的逆置
9.求數組的最大值、最小值、平均值
10.對數組字符串進行連接
11.冒泡排序法的實現
12.數組做函數的參數
13.二維數組:賦值和地址
14.二維數組:打印和輸出
15. 指針數組,每一個元素都是地址
17.數組的內存分配
本文標題:go語言字典排序,C語言實現字典排序
網頁鏈接:http://vcdvsql.cn/article44/hsdohe.html
成都網站建設公司_創新互聯,為您提供網站制作、小程序開發、做網站、虛擬主機、移動網站建設、建站公司
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯