[TOC]
排序
Go中排序函數(shù)
一維數(shù)組排序
sort.Ints([]int{5, 4, 3})
sort.Sort(sort.Reverse(sort.IntSlice{3, 2, 1}))
sort.Sort(sort.Reverse(sort.IntSlice(cost))) // cost=[]int{3,5,2,1}
二維矩陣排序
2.1 m*n矩陣,按照m升序
// input: [ [5 10] [0 30] [15 20]]
// output: [[0 30] [5 10] [15 20]]
sort.Slice(intervals, func(i, j int) bool {
return intervals[i][0] < intervals[j][0]
})
2.2 m*n矩陣田篇,先按m升序替废,m相同,按n升序
// m*n的矩陣泊柬,先按照m從小到大排序椎镣,遇到m相同的情況,按照n升序
sort.Slice(input, func(i, j int) bool {
if input[i][0] == input[j][0] { // 表示m相同兽赁,按照n升序
return input[i][1] < input[j][1]
}
return input[i][0] < input[j][0] // 按照m升序
})
// m*n的矩陣状答,先按照m從小到大排序,遇到m相同的情況刀崖,按照n升序
func SortAlo1(input [][]int) interface{} {
sort.Slice(input, func(i, j int) bool {
if input[i][0] == input[j][0] { // 表示m相同惊科,按照n升序
return input[i][1] < input[j][1]
}
return input[i][0] < input[j][0] // 按照m升序
})
return input
}
結(jié)構(gòu)體排序
// =================== 以下方法有點(diǎn)復(fù)雜 ===========
type Node struct {
dis int
worker int
bike int
}
type NodeArr []Node
func (arr NodeArr) Len() int {
return len(arr)
}
func (arr NodeArr) Swap(i, j int) {
arr[i], arr[j] = arr[j], arr[i]
}
func (arr NodeArr) Less(i, j int) bool {
if arr[i].dis == arr[j].dis {
if arr[i].worker == arr[j].worker {
return arr[i].bike < arr[j].bike
} else {
return arr[i].worker < arr[j].worker
}
} else {
return arr[i].dis < arr[j].dis
}
}
字符串包的使用
func main() {
fmt.Println("查找子串是否在指定的字符串中")
fmt.Println(" Contains 函數(shù)的用法")
fmt.Println(strings.Contains("seafood", "foo")) //true
fmt.Println(strings.Contains("seafood", "bar")) //false
fmt.Println(strings.Contains("seafood", "")) //true
fmt.Println(strings.Contains("", "")) //true 這里要特別注意
fmt.Println(strings.Contains("我是中國(guó)人", "我")) //true
fmt.Println("")
fmt.Println(" ContainsAny 函數(shù)的用法") // 查詢字符串中是否包含多個(gè)字符
fmt.Println(strings.ContainsAny("team", "i")) // false
fmt.Println(strings.ContainsAny("failure", "u & i")) // true
fmt.Println(strings.ContainsAny("foo", "")) // false
fmt.Println(strings.ContainsAny("", "")) // false
fmt.Println("")
fmt.Println(" ContainsRune 函數(shù)的用法")
fmt.Println(strings.ContainsRune("我是中國(guó)", '我')) // true 注意第二個(gè)參數(shù),用的是字符
fmt.Println("")
fmt.Println(" Count 函數(shù)的用法") // 統(tǒng)計(jì)字符串中有多少字符
fmt.Println(strings.Count("cheese", "e")) // 3
fmt.Println(strings.Count("five", "")) // before & after each rune result: 5 , 源碼中有實(shí)現(xiàn)
fmt.Println("")
fmt.Println(" EqualFold 函數(shù)的用法")
fmt.Println(strings.EqualFold("Go", "go")) //大小寫忽略,字符串比較是否相等,忽略大小寫的比較
fmt.Println("")
fmt.Println(" Fields 函數(shù)的用法")
fmt.Println("Fields are: %q", strings.Fields(" foo bar baz ")) //["foo" "bar" "baz"] 返回一個(gè)列表 分割字符串
//相當(dāng)于用函數(shù)做為參數(shù)蒲跨,支持匿名函數(shù)
for _, record := range []string{" aaa*1892*122", "aaa\taa\t", "124|939|22"} {
fmt.Println(strings.FieldsFunc(record, func(ch rune) bool {
switch {
case ch > '5':
return true
}
return false
}))
}
fmt.Println("")
fmt.Println(" HasPrefix 函數(shù)的用法")
fmt.Println(strings.HasPrefix("NLT_abc", "NLT")) //前綴是以NLT開頭的
fmt.Println("")
fmt.Println(" HasSuffix 函數(shù)的用法")
fmt.Println(strings.HasSuffix("NLT_abc", "abc")) //后綴是以NLT開頭的
fmt.Println("")
fmt.Println(" Index 函數(shù)的用法")
fmt.Println(strings.Index("NLT_abc", "abc")) // 返回第一個(gè)匹配字符的位置译断,這里是4
fmt.Println(strings.Index("NLT_abc", "aaa")) // 在存在返回 -1
fmt.Println(strings.Index("我是中國(guó)人", "中")) // 在存在返回 6
fmt.Println("")
fmt.Println(" IndexAny 函數(shù)的用法")
fmt.Println(strings.IndexAny("我是中國(guó)人", "中")) // 在存在返回 6
fmt.Println(strings.IndexAny("我是中國(guó)人", "和")) // 在存在返回 -1
fmt.Println("")
fmt.Println(" Index 函數(shù)的用法")
fmt.Println(strings.IndexRune("NLT_abc", 'b')) // 返回第一個(gè)匹配字符的位置授翻,這里是4
fmt.Println(strings.IndexRune("NLT_abc", 's')) // 在存在返回 -1
fmt.Println(strings.IndexRune("我是中國(guó)人", '中')) // 在存在返回 6
fmt.Println("")
fmt.Println(" Join 函數(shù)的用法")
s := []string{"foo", "bar", "baz"}
fmt.Println(strings.Join(s, ", ")) // 返回字符串:foo, bar, baz
fmt.Println("")
fmt.Println(" LastIndex 函數(shù)的用法")
fmt.Println(strings.LastIndex("go gopher", "go")) // 3
fmt.Println("")
fmt.Println(" LastIndexAny 函數(shù)的用法")
fmt.Println(strings.LastIndexAny("go gopher", "go")) // 4
fmt.Println(strings.LastIndexAny("我是中國(guó)人", "中")) // 6
fmt.Println("")
fmt.Println(" Map 函數(shù)的用法")
rot13 := func(r rune) rune {
switch {
case r >= 'A' && r <= 'Z':
return 'A' + (r-'A'+13)%26
case r >= 'a' && r <= 'z':
return 'a' + (r-'a'+13)%26
}
return r
}
fmt.Println(strings.Map(rot13, "'Twas brillig and the slithy gopher..."))
fmt.Println("")
fmt.Println(" Repeat 函數(shù)的用法")
fmt.Println("ba" + strings.Repeat("na", 2)) //banana
fmt.Println("")
fmt.Println(" Replace 函數(shù)的用法")
fmt.Println(strings.Replace("oink oink oink", "k", "ky", 2))
fmt.Println(strings.Replace("oink oink oink", "oink", "moo", -1))
fmt.Println("")
fmt.Println(" Split 函數(shù)的用法")
fmt.Printf("%q\n", strings.Split("a,b,c", ","))
fmt.Printf("%q\n", strings.Split("a man a plan a canal panama", "a "))
fmt.Printf("%q\n", strings.Split(" xyz ", ""))
fmt.Printf("%q\n", strings.Split("", "Bernardo O'Higgins"))
fmt.Println("")
fmt.Println(" SplitAfter 函數(shù)的用法")
fmt.Printf("%q\n", strings.SplitAfter("/home/m_ta/src", "/")) //["/" "home/" "m_ta/" "src"]
fmt.Println("")
fmt.Println(" SplitAfterN 函數(shù)的用法")
fmt.Printf("%q\n", strings.SplitAfterN("/home/m_ta/src", "/", 2)) //["/" "home/m_ta/src"]
fmt.Printf("%q\n", strings.SplitAfterN("#home#m_ta#src", "#", -1)) //["#" "home#" "m_ta#" "src"]
fmt.Println("")
fmt.Println(" SplitN 函數(shù)的用法")
fmt.Printf("%q\n", strings.SplitN("/home/m_ta/src", "/", 1))
fmt.Printf("%q\n", strings.SplitN("/home/m_ta/src", "/", 2)) //["" "home/m_ta/src"]
fmt.Printf("%q\n", strings.SplitN("/home/m_ta/src", "/", -1)) //["" "home" "m_ta" "src"]
fmt.Printf("%q\n", strings.SplitN("home,m_ta,src", ",", 2)) //["home" "m_ta,src"]
fmt.Printf("%q\n", strings.SplitN("#home#m_ta#src", "#", -1)) //["/" "home/" "m_ta/" "src"]
fmt.Println("")
fmt.Println(" Title 函數(shù)的用法") //這個(gè)函數(shù)或悲,還真不知道有什么用
fmt.Println(strings.Title("her royal highness"))
fmt.Println("")
fmt.Println(" ToLower 函數(shù)的用法")
fmt.Println(strings.ToLower("Gopher")) //gopher
fmt.Println("")
fmt.Println(" ToLowerSpecial 函數(shù)的用法")
fmt.Println("")
fmt.Println(" ToTitle 函數(shù)的用法")
fmt.Println(strings.ToTitle("loud noises"))
fmt.Println(strings.ToTitle("loud 中國(guó)"))
fmt.Println("")
fmt.Println(" Replace 函數(shù)的用法")
fmt.Println(strings.Replace("ABAACEDF", "A", "a", 2)) // aBaACEDF
//第四個(gè)參數(shù)小于0,表示所有的都替換堪唐, 可以看下golang的文檔
fmt.Println(strings.Replace("ABAACEDF", "A", "a", -1)) // aBaaCEDF
fmt.Println("")
fmt.Println(" ToUpper 函數(shù)的用法")
fmt.Println(strings.ToUpper("Gopher")) //GOPHER
fmt.Println("")
fmt.Println(" Trim 函數(shù)的用法")
fmt.Printf("[%q]", strings.Trim(" !!! Achtung !!! ", "! ")) // ["Achtung"]
fmt.Println("")
fmt.Println(" TrimLeft 函數(shù)的用法")
fmt.Printf("[%q]", strings.TrimLeft(" !!! Achtung !!! ", "! ")) // ["Achtung !!! "]
fmt.Println("")
fmt.Println(" TrimSpace 函數(shù)的用法")
fmt.Println(strings.TrimSpace(" \t\n a lone gopher \n\t\r\n")) // a lone gopher
}
Go中Bytes包的使用
func main() {
// Compare函數(shù):對(duì)比參數(shù)一和參數(shù)二
// 如果a==b返回0巡语,
// 如果a<b返回-1;否則返回+1淮菠,nil參數(shù)視為空切片
fmt.Println("1男公、Compare的使用例子:")
fmt.Println(bytes.Compare([]byte{1, 3, 4, 5, 5}, []byte{1, 2, 3, 1, 4})) // 結(jié)果為1
fmt.Println(bytes.Compare([]byte{1, 3, 4, 5, 5}, []byte{1, 3, 4, 5, 5})) // 結(jié)果為0
fmt.Println(bytes.Compare([]byte{1, 2, 4, 5, 5}, []byte{1, 3, 4, 5, 5})) // 結(jié)果為-1
fmt.Println(bytes.Compare([]byte{}, []byte{})) // 結(jié)果為0
//Equal函數(shù):判斷兩個(gè)切片的內(nèi)容是否相等,Equal函數(shù)入?yún)⒈仨毷荹]byte類型
fmt.Println("2、Equal的使用例子:")
fmt.Println(bytes.Equal([]byte{1, 2, 3, 5}, []byte{1, 2, 3, 5})) // 結(jié)果為true
//EqualFold函數(shù):判斷兩個(gè)utf-8編碼切片是否相同
fmt.Println("3合陵、EqualFold的使用例子:")
fmt.Println(bytes.EqualFold([]byte{'a', 'b', 'c', 'd', 'e'}, []byte{'a', 'b', 'c', 'f', 'e'})) // 結(jié)果為false
fmt.Println(bytes.EqualFold([]byte{'a', 'b', 'c', 'd', 'e'}, []byte{'a', 'b', 'c', 'd', 'e'})) // 結(jié)果為true
//Runes函數(shù):返回與參數(shù)等價(jià)的[]rune切片
fmt.Println("4枢赔、Runes的使用例子:")
fmt.Println(bytes.Runes([]byte{'a', 'b', 'c', 'd', 'e'})) // [97 98 99 100 101]
//HasPrefix函數(shù):判斷參數(shù)一是否有前綴切片參數(shù)二
fmt.Println("5澄阳、HasPrefix的使用例子:")
fmt.Println(bytes.HasPrefix([]byte{'a', 'b', 'c', 'd', 'e'}, []byte{'a'})) // 結(jié)果為true
//HasSuffix函數(shù):判斷參數(shù)一是否有后綴切片er
fmt.Println("6、HasSuffix的使用例子:")
fmt.Println(bytes.HasSuffix([]byte{'a', 'b', 'c', 'd', 'e'}, []byte{'c'})) // 結(jié)果為false
fmt.Println(bytes.HasSuffix([]byte{'a', 'b', 'c', 'd', 'e'}, []byte{'e'})) // 結(jié)果為true
//Contains函數(shù):判斷參數(shù)一中是否包含參數(shù)二切片
fmt.Println("7踏拜、Contains的使用例子:")
fmt.Println(bytes.Contains([]byte{'a', 'b', 'c', 'd', 'e'}, []byte{'d'})) // 結(jié)果為true
//Count:計(jì)算參數(shù)一中包含多少個(gè)參數(shù)二切片
fmt.Println("8碎赢、Count的使用例子:")
fmt.Println(bytes.Count([]byte{'a', 'b', 'c', 'd', 'e', 'd'}, []byte{'d'})) // 結(jié)果為2
//Index:計(jì)算參數(shù)二第一次出現(xiàn)在參數(shù)一的位置,不存在返回-1
fmt.Println("8速梗、Index的使用例子:")
fmt.Println(bytes.Index([]byte{'a', 'b', 'c', 'd', 'e'}, []byte{'d'})) // 結(jié)果為3
//IndexByte:字符參數(shù)二在參數(shù)一中第一次出現(xiàn)的位置肮塞,不存在返回-1
fmt.Println("9、IndexByte的使用例子:")
fmt.Println(bytes.IndexByte([]byte{'a', 'b', 'c', 'd', 'e'}, byte('c'))) // 結(jié)果為2
//IndexRune:rune類型utf-8的參數(shù)二在參數(shù)一中第一次出現(xiàn)的位置
fmt.Println("10姻锁、IndexRune的使用例子:")
fmt.Println(bytes.IndexRune([]byte("我來自中國(guó)"), rune('我'))) // 結(jié)果為0
//IndexAny:參數(shù)二字符串中任意一個(gè)utf-8字符出現(xiàn)在參數(shù)一中的位置
fmt.Println("11枕赵、IndexAny的使用例子:")
fmt.Println(bytes.IndexAny([]byte("我來自中國(guó)"), "來國(guó)")) // 結(jié)果為3
//LastIndex:參數(shù)二最后一次出現(xiàn)在參數(shù)一中的位置
fmt.Println("12、LastIndex的使用例子:")
fmt.Println(bytes.LastIndex([]byte("hahahahaxswl"), []byte("a"))) // 結(jié)果為7
//LastIndexAny:參數(shù)二中任意一utf-8字符在參數(shù)一中最后一次出現(xiàn)的位置
fmt.Println("13位隶、LastIndexAny的使用例子:")
fmt.Println(bytes.LastIndexAny([]byte("我來自中國(guó)"), "來國(guó)")) // 結(jié)果為12
//Title:將參數(shù)中的單詞首字母都改成標(biāo)題格式然后返回
fmt.Println("14拷窜、Title的使用例子:")
fmt.Println(string(bytes.Title([]byte{'a', 'b', 'c', 'd', 'e'}))) // 結(jié)果為Abcde
//ToLower將參數(shù)中的所有字母都轉(zhuǎn)換成小寫
fmt.Println("15、ToLower的使用例子:")
fmt.Println(string(bytes.ToLower(bytes.Title([]byte{'A', 'b', 'C', 'd', 'e'})))) // 結(jié)果為abcde
//ToUpper:將參數(shù)中的字母全轉(zhuǎn)換成大寫
fmt.Println("16钓试、ToUpper的使用例子:")
fmt.Println(string(bytes.ToUpper([]byte{'A', 'b', 'C', 'd', 'e'}))) // 結(jié)果為ABCDE
//ToTitle:將參數(shù)中所有的字母都轉(zhuǎn)換成對(duì)應(yīng)的標(biāo)題版本
fmt.Println("17装黑、ToTitle的使用例子:")
fmt.Println(string(bytes.ToTitle([]byte{'A', 'b', 'C', 'd', 'e'}))) // 結(jié)果為ABCDE
//Repeat:拷貝參數(shù)二個(gè)參數(shù)一然后組成一個(gè)新的切片
fmt.Println("18、Repeat的使用例子:")
fmt.Println(string(bytes.Repeat([]byte{'h', 'e', 'l', 'l', 'o'}, 3))) // 結(jié)果為 hellohellohello
/*Replace:切換切片中的內(nèi)容弓熏,返回將s中前n個(gè)不重疊old切片序列都替換為new的新的切片拷貝
恋谭,如果n<0會(huì)替換所有old子切片
方法源碼:func Replace(s, old, new []byte, n int) []byte
*/
fmt.Println("19、Replace的使用例子:")
fmt.Println(string(bytes.Replace([]byte{'h', 'e', 'l', 'l', 'o'}, []byte{'l'}, []byte{'c'}, 1))) // 結(jié)果為 heclo
//Trim:將參數(shù)一前后端包含參數(shù)二切去
fmt.Println("20挽鞠、Trim的使用例子:")
fmt.Println(string(bytes.Trim([]byte{'h', 'e', 'l', 'l', 'h'}, "h"))) //結(jié)果為ell
//TrimSpace:返回將參數(shù)前后端空白都去掉的子切片
fmt.Println("21疚颊、trmSpace的使用例子:")
fmt.Println(string([]byte(" hello World "))) // 結(jié)果 hello World
fmt.Println(string(bytes.TrimSpace([]byte(" hello World ")))) // 結(jié)果為 hello World
//TrimLeft:將參數(shù)一切片前端滿足參數(shù)二的部分切除返回一個(gè)新的子切片
fmt.Println("22、TrimLeft的使用例子:")
fmt.Println(string(bytes.TrimLeft([]byte("hello World"), "he"))) // 結(jié)果為 llo World
//TrimPrefix:返回去除參數(shù)一可能的前綴參數(shù)二的子切片
fmt.Println("23信认、TrimPrefix的使用例子:")
fmt.Println(string(bytes.TrimPrefix([]byte("hello World"), []byte("hello")))) // 結(jié)果為 World(word前有空格)
//TrimRight:將參數(shù)一后端包含參數(shù)二的部分刪除并返回新切片
fmt.Println("24材义、TrimRight的使用例子:")
fmt.Println(string(bytes.TrimRight([]byte("hello World"), "ld"))) // hello Wor
//TrimSuffix:返回去除參數(shù)一可能的后綴參數(shù)二的子切片
fmt.Println("25、TrimSuffix的使用例子:")
fmt.Println(string(bytes.TrimSuffix([]byte("hello World"), []byte("ld")))) // hello Wor
//Fields:返回將字符串按照空白分割成多個(gè)子切片
fmt.Println("26嫁赏、Fields的使用例子:")
fmt.Println(bytes.Fields([]byte("hello World"))) // [[104 101 108 108 111] [87 111 114 108 100]]
//Split:去掉參數(shù)一中出現(xiàn)的參數(shù)二的方式進(jìn)行分割其掂,返回一個(gè)二維切片
fmt.Println("27、Split的使用例子:")
fmt.Println(bytes.Split([]byte("hello&World"), []byte("&"))) // [[104 101 108 108 111] [87 111 114 108 100]]
//SplitAfter:用從參數(shù)一出現(xiàn)的參數(shù)二后面進(jìn)行分割
fmt.Println("28潦蝇、SplitAfter的使用例子:")
fmt.Println(bytes.SplitAfter([]byte("hello&wor&ld"), []byte("&"))) // [[104 101 108 108 111 38] [119 111 114 38] [108 100]]
//Join將參數(shù)一切片鏈接成一個(gè)切片款熬,中間用參數(shù)二隔開
fmt.Println("29、Join的使用方法")
fmt.Println(string(bytes.Join([][]byte{{'h', 'e', 'l', 'l', 'o'}, {'w', 'o', 'r', 'l', 'd'}}, []byte(" ")))) // hello world
}