• Go 函数


    Golang之匿名函数和闭包

    Go语言支持匿名函数,即函数可以像普通变量一样被传递或使用。

    使用方法如下:

    main.go

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        var v func(a int) int
        v = func(a int) int {
            return a * a
        }
        fmt.Println(v(6))
    //两种写法
        v1 := func(i int) int {
            return i * i
    
        }
        fmt.Println(v1(7))
    }

    GO语言的匿名函数就是闭包,以下是《GO语言编程》中对闭包的解释

     基本概念
    闭包是可以包含自由(未绑定到特定对象)变量的代码块,这些变量不在这个代码块内或者
    任何全局上下文中定义,而是在定义代码块的环境中定义。要执行的代码块(由于自由变量包含
    在代码块中,所以这些自由变量以及它们引用的对象没有被释放)为自由变量提供绑定的计算环
    境(作用域)。
     闭包的价值
    闭包的价值在于可以作为函数对象或者匿名函数,对于类型系统而言,这意味着不仅要表示
    数据还要表示代码。支持闭包的多数语言都将函数作为第一级对象,就是说这些函数可以存储到
    变量中作为参数传递给其他函数,最重要的是能够被函数动态创建和返回。

    再次讲解闭包:

    一个函数和与其相关的引用环境,组合而成的实体:

    package main
    
    import "fmt"
    
    func main() {
        var f = Adder()
        fmt.Println(f(1), "-")
        fmt.Println(f(20), "-")
        fmt.Println(f(300), "-")
    
    }
    func Adder() func(int) int {
        var x int
        return func(delta int) int {
            x += delta
            return x
        }
    }

    测试文件后缀的闭包。。

    package main
    
    import (
        "fmt"
        "strings"
    )
    
    func makeSuffix(suffix string) func(string) string {
        return func(name string) string {
            if strings.HasSuffix(name, suffix) == false {
                return name + suffix
            }
            return name
        }
    }
    
    func main() {
        //判断字符串 以bmp结尾
        f1 := makeSuffix(".bmp")
        fmt.Println(f1("test"))
        fmt.Println(f1("pic"))
        f2 := makeSuffix(".jpg")
        fmt.Println(f2("test"))
        fmt.Println(f2("pic"))
    }

    Golang作用域—坑

    先举个栗子,全局作用域变量,与 := 符号声明赋值新变量

    package main
    
    import "fmt"
    
    var a = "GG"
    
    func main() {
        n()
        m()
        n()
    }
    func n() {
        fmt.Println(a)
    }
    func m() {
        // 对于 := 定义的变量,新变量a与全局已定义的a变量同名,不在一个作用域
        //所以golong定义新的变量a。遮住全局变量a,所以m()打印"66"
        a := "66"
        fmt.Println(a)
    }

    局部变量

    在函数体内声明的变量称之为局部变量,它们的作用域只在函数体内,参数和返回值变量也是局部变量。

    以下实例中 main() 函数使用了局部变量 a, b, c:

    package main
    
    import "fmt"
    
    func main() {
       /* 声明局部变量 */
       var a, b, c int 
    
       /* 初始化参数 */
       a = 10
       b = 20
       c = a + b
    
       fmt.Printf ("结果: a = %d, b = %d and c = %d
    ", a, b, c)
    }
    局部变量声明

    全局变量

    在函数体外声明的变量称之为全局变量,全局变量可以在整个包甚至外部包(被导出后)使用。

    全局变量可以在任何函数中使用,以下实例演示了如何使用全局变量:

    package main
    
    import "fmt"
    
    /* 声明全局变量 */
    var g int
    
    func main() {
    
       /* 声明局部变量 */
       var a, b int
    
       /* 初始化参数 */
       a = 10
       b = 20
        //调用全局变量声明的g
       g = a + b
    
       fmt.Printf("结果: a = %d, b = %d and g = %d
    ", a, b, g)
    }
    全局变量引用

    Go 语言程序中全局变量与局部变量名称可以相同,但是函数内的局部变量会被优先考虑。实例如下:

    package main
    
    import "fmt"
    
    /* 声明全局变量 */
    var g int = 20
    
    func main() {
       /* 声明局部变量 */
       var g int = 10
    
       fmt.Printf ("结果: g = %d
    ",  g)
    }
    
    //结果是g = 10  ,优先考虑局部变量

    形式参数

    形式参数会作为函数的局部变量来使用。

    package main
    
    import "fmt"
    
    /* 声明全局变量 */
    var a int = 20;
    
    func main() {
       /* main 函数中声明局部变量 */
       var a int = 10
       var b int = 20
       var c int = 0
    
       fmt.Printf("main()函数中 a = %d
    ",  a);
       c = sum( a, b);
       fmt.Printf("main()函数中 c = %d
    ",  c);
    }
    
    /* 函数定义-两数相加 */
    func sum(a, b int) int {
       fmt.Printf("sum() 函数中 a = %d
    ",  a);
       fmt.Printf("sum() 函数中 b = %d
    ",  b);
    
       return a + b;
    }
    形式参数

    初始化局部和全局变量

    不同类型的局部和全局变量默认值为:

    数据类型初始化默认值
    int 0
    float32 0
    pointer nil

    golang之math/rand随机数

    简单的随机数生成,结合时间模块初始化种子

    package main
    import (
        "fmt"
        "math/rand"
        "time"
    )
    func init(){
        //以时间作为初始化种子
        rand.Seed(time.Now().UnixNano())
    }
    func main() {
    
        for i := 0; i < 10; i++ {
            a := rand.Int()
            fmt.Println(a)
        }
        for i := 0; i < 10; i++ {
            a := rand.Intn(100)
            fmt.Println(a)
        }
        for i := 0; i < 10; i++ {
            a := rand.Float32()
            fmt.Println(a)
        }
    
    }

    Golang之fmt格式“占位符”

    golang的fmt包实现了格式化I/O函数:

    package main
    
    import "fmt"
    
    type Human struct {
        Name string
    }
    
    func main() {
        //普通占位符
        var people = Human{Name: "咸鱼兆"}
        // %+v 添加字段名,输出相应值的默认格式
        fmt.Printf("%+v
    ", people)
        //相应值用go语法形式输出
        fmt.Printf("%#v", people)
        //相应值的类型用go语法形式输出
        fmt.Printf("%T
    ", people)
        //打印 符号%
        fmt.Printf("百分比:90%%
    ")
        //布尔占位符
        fmt.Printf("%t
    ", true)
        //用二进制表示
    
        //整数占位符
        fmt.Printf("%b
    ", 5)
        //相应Unicode码 表示的字符
        fmt.Printf("%c
    ", 0x4e2d)
        // 十进制表示
        fmt.Printf("%d
    ", 0x12)
        //八进制表示
        fmt.Printf("%o
    ", 10)
        //单引号围绕的字符字面值,由Go语法转义
        fmt.Printf("%q
    ", 0x4e2d)
        //十六进制表示,字母形式为小写a-f
        fmt.Printf("%x
    ", 13)
        //十六进制表示,字母形式为小写A-F
        fmt.Printf("%X
    ", 13)
    
        //字符串与字节 切片
        //输出字符串表示(string类型或[]byte)
        fmt.Printf("%s
    ",[]byte("说Go就Go"))
        //双引号围绕的字符串,由Go语法安全的转义
        fmt.Printf("%q
    ","说Go咱就Go")
    
    
        //指针
        fmt.Printf("%p
    ",&people)
    
        //其他标记 只输出ascii编码的字符
        fmt.Printf("%+q
    ","中文")
        //
    
    }

    Golang之字符串操作(反转中英文字符串)

    //字符串反转
    package main import
    "fmt" func reverse(str string) string { var result string strLen := len(str) for i := 0; i < strLen; i++ { result = result + fmt.Sprintf("%c", str[strLen-i-1]) } return result } func reverse1(str string) string { var result []byte tmp := []byte(str) length := len(str) for i := 0; i < length; i++ { result = append(result, tmp[length-i-1]) } return string(result) } func main() { var str1 = "hello" str2 := "world" str3 := fmt.Sprintf("%s %s", str1, str2) n := len(str3) fmt.Println(str3) fmt.Printf("len(str3)=%d ", n) substr := str3[0:5] fmt.Println(substr) substr = str3[6:] fmt.Println(substr) result := reverse(str3) fmt.Println(result) result = reverse1(result) fmt.Println(result) }

    字符串练习

    package main
    
    import (
        "fmt"
    )
    
    func testString() {
        var str = "hello"
        fmt.Printf("str[0]=%c len(str)=%d
    ", str[0], len(str))
    
        for index, val := range str {
            fmt.Printf("str[%d]=%c
    ", index, val)
        }
    
        //str[0] = '0'
        //fmt.Println("after modify:", str)
        var byteSlice []byte
        byteSlice = []byte(str)
        byteSlice[0] = '0'
        str = string(byteSlice)
    
        fmt.Println("after modify:", str)
    
        fmt.Printf("len(str)=%d
    ", len(str))
    
        str = "hello, 少林之巅"
        fmt.Printf("len(str)=%d
    ", len(str))
    
        str = "中问123"
        fmt.Printf("last:len(str)=%d
    ", len(str))
    
        var b rune = ''
        fmt.Printf("b=%c
    ", b)
    
        var runeSlice []rune
        runeSlice = []rune(str)
        fmt.Printf("str 长度:%d, len(str)=%d
    ", len(runeSlice), len(str))
    }
    
    func testReverseStringV1() {
        var str = "hello中文 "
        var bytes []byte = []byte(str)
    
        for i := 0; i < len(str)/2; i++ {
            tmp := bytes[len(str)-i-1]
            bytes[len(str)-i-1] = bytes[i]
            bytes[i] = tmp
        }
    
        str = string(bytes)
        fmt.Println(str)
    }
    
    func testReverseStringV2() {
        var str = "hello中文 "
        var r []rune = []rune(str)
    
        for i := 0; i < len(r)/2; i++ {
            tmp := r[len(r)-i-1]
            r[len(r)-i-1] = r[i]
            r[i] = tmp
        }
    
        str = string(r)
        fmt.Println(str)
    }
    
    func testHuiWen() {
        var str = "上海自来水来自海上"
        var r []rune = []rune(str)
    
        for i := 0; i < len(r)/2; i++ {
            tmp := r[len(r)-i-1]
            r[len(r)-i-1] = r[i]
            r[i] = tmp
        }
    
        str2 := string(r)
        if str2 == str {
            fmt.Println(str, " is huiwen")
        } else {
            fmt.Println(str, " is not huiwen")
        }
    }
    
    func main() {
        //testString()
        //testReverseStringV2()
        testHuiWen()
    }

    Golang之strings包

    只列举了部分函数方法的使用:

    package main
    
    import (
        "fmt"
        "strings"
    )
    
    func main() {
        Count计算 sep在s中的非重叠个数
         func Count(s, substr string) int {
        s := "Hello,超哥"
        统计 l 出现的次数
        n := strings.Count(s, "l")
        fmt.Println(n) //2
        如果substr 为空,返回s中字符个数+1
        n=strings.Count(s,"")
        fmt.Println(n)
    
        Contains判断 字符串 s中 是否包含 子串 substr
        func Contains(s, substr string) bool {
        substr什么都不写,返回true
        存在返回true,否则false
        s := "Hello,超哥!!"
        b := strings.Contains(s, "!")
        fmt.Println(b)               //true
        b = strings.Contains(s, "@") //false
        fmt.Println(b)
        b=strings.Contains(s,"")
        fmt.Println(b)
    
        ContainsAny 判断字符串 s 中是否 包含 chars 中的任意一个字符
        如果char为空,返回false
        func ContainsAny(s, chars string) bool {
        s := "Hello,超哥"
        b := strings.ContainsAny(s,"abc")
        fmt.Println(b)//false
        b=strings.ContainsAny(s,"def")//true
        fmt.Println(b)
        b=strings.ContainsAny(s,"")//false
        fmt.Println(b)
    
        ContainsRune判断字符串s中是否包含字符r
        rune不能为空,存在true,否则false
        func ContainsRune(s string, r rune) bool {
        s := "Hello,超哥!"
        b := strings.ContainsRune(s, '
    ')
        fmt.Println(b) //false
        b = strings.ContainsRune(s, '')
        fmt.Println(b) //true
        b = strings.ContainsRune(s, 'o')
        fmt.Println(b)//true
    
        IndexAny 返回字符串 chars中的任何一个字符 在字符串s中 第一次出现的位置(索引)
        找不到返回-1 ,chars为空也返回-1
        func strings.IndexAny()
        s := "Hello,超哥!Hello!"
        b := strings.IndexAny(s, "abc")
        fmt.Println(b) //-1
        b = strings.IndexAny(s, "")
        fmt.Println(b) //-1
        b = strings.IndexAny(s, "")
        fmt.Println(b)
    
        LastIndexAny返回字符串chars中的任何一个字符串s中最后一次出现的位置
        找不到返回-1,chars为空也返回-1
        func LastIndexAny(s, chars string) int {
        s:="Hello,世界!Hello!"
        b:=strings.LastIndexAny(s,"abc")
        fmt.Println(b)//-1
        b=strings.LastIndexAny(s,"")
        fmt.Println(b)//6 最后一次出现的索引位置
        b=strings.LastIndexAny(s,"")
        fmt.Println(b)//-1
    
    }

    比较全的是golang中文网的:https://studygolang.com/articles/5769

    package main
    
    import "fmt"
    
    /*
    函数练习,
    可变参数使用
    
    写一个函数add 支持1个或多个int相加,并返回相加结果
    写一个函数concat,支持1个或多个string拼接,并返回结果
     */
    func add(a int, arg ...int) int {
        sum := a
        for i := 0; i < len(arg); i++ {
            sum += arg[i]
        }
        return sum
    }
    
    func concat(a string, arg ...string) (result string) {
        result = a
        for i := 0; i < len(arg); i++ {
            result += arg[i]
        }
        return
    }
    
    func main() {
        sum := add(10, 3, 3, 3, 3, 3)
        fmt.Println(sum)
        res:=concat("hello"," ","大屌")
        fmt.Println(res)
    }

    九九乘法表:

    package main
    
    import "fmt"
    //99乘法表
    func multi() {
        for i := 0; i < 9; i++ {
            for j := 0; j <= i; j++ {
                fmt.Printf("%d*%d=%d	", (i + 1), j+1, (i+1)*(j+1))
            }
            fmt.Println()
        }
    
    }
    func main() {
        multi()
    
    }

    检测回文(中文):

    package main
    
    import (
        "fmt"
    )
    
    func process(str string) bool {
        t := []rune(str)
        length := len(t)
        for i, _ := range t {
            if i == length/2 {
                break
            }
            last := length - i - 1
            if t[i] != t[last] {
                return false
            }
        }
        return true
    }
    func main() {
        var str string
        fmt.Scanf("%sd", &str)
        if process(str) {
            fmt.Println("yes")
        } else {
            fmt.Println("no")
        }
    }

    统计一段字符串,中文,字符,数字,空格,出现的次数:

    package main
    
    import (
        "bufio"
        "fmt"
        "os"
    )
    
    func count(str string) (wordCount, spaceCount, numberCount, otherCount int) {
        t := []rune(str)
        for _, v := range t {
            switch {
            case v >= 'a' && v <= 'z':
                fallthrough
            case v >= 'A' && v <= 'Z':
                //golang里面++是语句,不能写成表达式
                wordCount++
            case v == ' ':
                spaceCount++
            case v >= '0' && v <= '9':
                numberCount++
            default:
                otherCount++
            }
        }
        return
    }
    
    func main() {
        reader := bufio.NewReader(os.Stdin)
        result, _, err := reader.ReadLine()
        //如果错误不为空,说明有错,就报错
        if err != nil {
            fmt.Println("read from console err:", err)
            return
        }
        wc,sc,nc,oc:=count(string(result))
        fmt.Printf("word Count:%d
     space count:%d
     number count:%d
     others count:%d
    ",wc,sc,nc,oc)
    }

    golang之panic,recover,defer

    defer,recover:

    运行时恐慌一旦被引发,就会向调用方传播直至程序崩溃。

    recover内建函数用于“拦截”运行时恐慌,可以使当前的程序从恐慌状态中恢复并重新获得流程控制权。

    recover函数被调用后,会返回一个interface{}类型的结果。如果当时的程序正处于运行时恐慌的状态,那么这个结果就是非nil的

    package main
    
    import (
        "fmt"
        "time"
    )
    
    func test() {
        defer func() {
            //defer中使用recover来捕获异常
            //defer在函数执行结束最后,执行该方法
            if err := recover(); err != nil {
                fmt.Println(err)
            }
        }()
        b := 0
        a := 100 / b
        fmt.Println(a)
        return
    }
    
    func main() {
        for {
            test()
            time.Sleep(time.Second)
        }
        var a []int
        a = append(a, 10, 20, 383)
        a = append(a, a...)
        fmt.Println(a)
    
    }

    panic:

    为了报告运行期间的致命错误

    用于停止当前的控制流程并引发一个运行时错误,它可以接受一个任意类型的参数值,参数值类型常常是string或者error

    package main
    
    import (
        "errors"
        "fmt"
        "time"
    )
    
    func initConfig() (err error) {
        return errors.New("init config failed")
    }
    
    func test() {
        //defer func() {
        //    //defer中使用recover来捕获异常
        //    //defer在函数执行结束最后,执行该方法
        //    if err := recover(); err != nil {
        //        fmt.Println(err)
        //    }
        //}()
        err := initConfig()
        if err != nil {
            panic(err)
        }
        return
    }
    
    func main() {
        for {
            test()
            time.Sleep(time.Second)
        }
        var a []int
        a = append(a, 10, 20, 383)
        a = append(a, a...)
        fmt.Println(a)
    
    }

    go运行时系统引发的错误,如

    func main() {
        myIndex := 4
        ia := [3]int{1, 2, 3}
        _ = ia[myIndex]
    }

    panic函数传入一个runtime.Error类型的参数值,runtime.Error是一个接口类型,并且内嵌了Go内置的error接口类型。

    golang之递归

    package main
    
    import (
        "fmt"
        "time"
    )
    
    /*
    递归原则,一个大问题分解成相似的小问题
    定义好出口条件,否则死循环
    */
    func calc(n int) int {
        if n == 1 {
            return 1
        }
        return calc(n-1) * n
    }
    
    func recusive(n int) {
        fmt.Println("你好呀")
        time.Sleep(time.Second)
        if n > 10 {
            return
        }
        recusive(n + 1)
    }
    func factor(n int) int {
        if n == 1 {
            return 1
        }
        return factor(n-1) * n
    }
    
    //斐波那
    func fab(n int) int {
        if n <= 1 {
            return 1
        }
        return fab(n-1) + fab(n-2)
    }
    
    func main() {
        //fmt.Println(factor(5))
        //recusive(0)
        for i := 0; i < 10; i++ {
            fmt.Println(fab(i))
        }
    }

    golang之数组

    1.数组:同一种数据类型的固定长度的序列。

    2.数组定义:var a [len]int,例如:var a [5]int

    3.长度是数组类型的一部分,因此,var a[5] int 和 var a[10]int 是不同的类型

    4.数组可以通过下标进行访问,下标是从0开始,最后一个元素是len-1

    for  i:=0;i<len(a);i++{

    }

    5.访问越界,如果下标在数组合法范围之外,就会触发越界,panic异常

    package main
    
    import "fmt"
    
    func main() {
        var a [10]int
        a[0] = 100
        fmt.Println(a)
        for i := 0; i < len(a); i++ {
            fmt.Println(a[i])
        }
    
        for index, val := range a {
            fmt.Printf("a[%d]==%d
    ", index, val)
        }
    }

    6.数组是值类型,因此改变副本的值,不会改变本身的值

    package main
    
    import "fmt"
    
    func test2() {
        var a [10]int
        b := a
        b[0] = 100
        fmt.Println(a)
    
    }
    //传递指针
    func test3(arr *[5]int) {
        (*arr)[0] = 1000
    }
    
    func main() {
        //test2()
        var a [5]int
        //传 地址,改变 值类型
        test3(&a)
        fmt.Println(a)
    }

    7.费波纳茨数列

    package main
    
    import "fmt"
    //菲波那切数列,非递归方式实现,打印前50个数
    func fab(n int){
        var a[]uint64
        a = make([]uint64,n)
        a[0]=1
        a[1]=1
        for i:=2;i<n;i++{
            a[i]=a[i-1]+a[i-2]
        }
        for _,v:=range a{
            fmt.Println(v)
        }
    }
    func main(){
        fab(50)
    }

    8.声明数组,遍历数组

    package main
    
    import "fmt"
    
    //数组的初始化
    func testArray() {
        var a [5]int = [5]int{1, 2, 3, 4, 5}
        var a1 = [5]int{1, 2, 3, 4, 5}
        var a2 = [...]int{38, 283, 48, 38, 348, 387, 484}
        var a3 = [...]int{1: 100, 3: 200}
        var a4 = [...]string{1: "hello", 3: "world"}
        fmt.Println(a)
        fmt.Println(a1)
        fmt.Println(a2)
        fmt.Println(a3)
        fmt.Println(a4)
    }
    
    //多维数组
    func muchArray() {
        //两行五列的数组
        var a [2][5]int = [...][5]int{{1, 2, 3, 4, 5}, {7, 8, 9, 11, 12}}
        for row,v:=range a{
            for col,v1:=range v{
                fmt.Printf("(%d,%d)=%d
    ",row,col,v1)
            }
        }
    }
    
    func main() {
        //testArray()
        muchArray()
    }

    golang之切片

    1.切片:切片是数组的一个引用,因此切片是引用类型

    2.切片的长度可以改变,因此,切片是个可变的数组。

    3.切片遍历方式和数组一样,可以用len()求长度

    4.cap可以求出slice最大的容量,0<=cap(slice)  <=len(array),其中array是slice引用的数组

    5.切片的定义:var 变量名 [ ]类型,例如:var str []string ,var arr [] int

    package main
    
    import "fmt"
    
    //slice,map,channel都是用make初始化
    func testSlice() {
        var slice []int
        //用数组初始化切片
        var arr [5]int = [...]int{1, 2, 3, 4, 5}
        //arr[start:end] 取头不取尾
        //arr[:] 复制一份数组
        //去掉切片最后一个元素可以写,slice[:len(slice)-1]
        //去掉第一个元素就是slice[1:]
        slice = arr[:]
        fmt.Println(slice)
        fmt.Println(len(slice))
        fmt.Println(cap(slice))
        fmt.Println()
        slice = slice[0:1]
        fmt.Println(len(slice))
        fmt.Println(cap(slice))
    
    }
    func main() {
        testSlice()
    }

    6.切片的内存布局。

    7.通过make创建切片

        var slice []type=make([]type,len)
        slice := make([]type,len)
        slice :=make([]type,len,cap)

    8.用append内置函数操作切片

    append是双倍cap扩容

    string底层就是一个byte的数组,也可以进行切片操作

    string底层布局

    package main
    
    import "fmt"
    
    func testSlice() {
        var a [5]int = [...]int{1, 2, 3, 4, 5}
        s := a[1:] //切片s是[2,3,4,5]
        fmt.Printf("before len[%d],cap[%d]
    ", len(s), cap(s))
        s[1] = 100
        //%p 指针
        fmt.Printf("s=%p a[1]=%p
    ", s, &a[1])
        fmt.Println("before a:", a)
        s = append(s, 10)
        s = append(s, 10)
        fmt.Printf("after len[%d] cap[%d]
    ", len(s), cap(s))
        s = append(s, 10)
        s = append(s, 10)
        s = append(s, 10)
        s[1] = 1000
        fmt.Println("after a:", a)
        fmt.Println(s)
        fmt.Printf("s=%p a[1]=%p
    ", s, &a[1])
        //append的...用法
        //append会扩容切片容量,默认cap的2倍
        fmt.Println("-----分隔符-----(append的...用法)")
        var a1=[]int{1,2,3}
        var b=[]int{4,5,6}
        a1=append(a1,b...)
        fmt.Println(a1)
        //切片拷贝,copy不会扩容
        fmt.Println("-----分隔符-----(切片拷贝)")
        s1:=[]int{1,2,3,4,5}
        s2:=make([]int,10)
        copy(s2,s1)//结果[1 2 3 4 5 0 0 0 0 0],以s1开头
        fmt.Println(s2)
        //string切片,string本身是不可改的
        fmt.Println("-----分隔符-----(string切片)")
        str:="hello world"
        res1:=str[0:5]
        fmt.Println(res1)
        res2:=str[6:]
        fmt.Println(res2)
    }
    
    //修改string的方法
    //改中文字符一定要用rune,不能用byte
    func testModifyString(){
        fmt.Println("----分隔符----")
        s:="我hello world"
        s1:=[]rune(s)
    
        s1[0]=''
        s1[1]=''
        s1[2]=''
    
        str:=string(s1)
        fmt.Println(str)
    }
    func main() {
        testSlice()
        testModifyString()
    }

    golang之切片与排序

    1.排序与查找操作

    排序操作在sort包中,sort.Ints对整数进行排序,sort.Strings对字符串进行排序,sort.Float64对浮点数进行排序

    package main
    
    import (
        "fmt"
        "sort"
    )
    
    func testIntSort() {
        var a = [...]int{1, 8, 38, 2, 348, 484}
        //数组是值类型,不能直接排序,必须转为切片
        sort.Ints(a[:])
        fmt.Println(a)
    }
    func testStrings() {
        var a = [...]string{"abc", "efg", "b", "A", "eeee"}
        //按照字母顺序排序,从小到大
        sort.Strings(a[:])
        fmt.Println(a)
    }
    
    func testFloat() {
        var a = [...]float64{2.3, 0.8, 28.2, 392342.2, 0, 6}
        //从小到大排序
        sort.Float64s(a[:])
        fmt.Println(a)
    }
    func testIntSearch() {
        var a = [...]int{1, 8, 38, 2, 348, 484}
        //数组是值类型,不能直接排序,必须转为切片
        sort.Ints(a[:])
        //SearchInts默认排序后的位置,一定要排序后在查找
        index:=sort.SearchInts(a[:],348)
    
        fmt.Println(index)
    }
    
    func main() {
        testIntSort()
        testStrings()
        testFloat()
        testIntSearch()
    }

    golang之map数据类型

    package main
    
    import "fmt"
    
    func testMap() {
        //两种声明map方式,切记,必须初始化才能用,否则panic
    
        //var a map[string]string = map[string]string{
        //    "key": "value",
        //}
        a := make(map[string]string, 10)
        a["abc"] = "efg"
        //map的key是唯一的,修改值可以直接改
        a["abc"] = "efg2"
        a["abc1"] = "efg"
        fmt.Println(a)
    }
    
    //map嵌套map
    //map是无序排序
    func testMap2() {
        a := make(map[string]map[string]string, 100)
        a["key1"] = make(map[string]string)
        a["key1"]["key2"] = "abc"
        a["key1"]["key3"] = "abc"
        a["key1"]["key4"] = "abc"
        a["key1"]["key5"] = "abc"
        fmt.Println(a)
    }
    
    func modify(a map[string]map[string]string) {
        _, ok := a["zhangsan"]
        if !ok {
            a["zhangsan"] = make(map[string]string)
        }
        //与_,ok写法一样
        //if a["zhangsan"] == nil {}
        //
        a["zhangsan"]["passwd"] = "123456"
        a["zhangsan"]["nickname"] = "pangpang"
        return
    }
    
    func testMap3() {
        a := make(map[string]map[string]string, 100)
        modify(a)
        fmt.Println(a)
    }
    func trans(a map[string]map[string]string) {
        for k, v := range a {
            fmt.Println(k)
            for k1, v1 := range v {
                fmt.Println("	", k1, v1)
            }
        }
    }
    func testMap4() {
        a := make(map[string]map[string]string, 100)
        a["key1"] = make(map[string]string)
        a["key1"]["key2"] = "abc"
        a["key1"]["key3"] = "abc"
        a["key1"]["key4"] = "abc"
        a["key1"]["key5"] = "abc"
        //删除map键的内置函数delete
        //delete(a,"key1")
        trans(a)
    
        fmt.Println(len(a))
    
    }
    
    func testMap5() {
        var a []map[int]int
        a = make([]map[int]int, 5)
    
        //for i:=0;i<5;i++{}
    
        //map,slice判断空是nil
        if a[0] == nil {
            a[0] = make(map[int]int)
        }
        a[0][10] = 10
        fmt.Println(a)
    }
    
    func main() {
        testMap()
        testMap2()
        testMap3()
        testMap4()
        testMap5()
    }

    map反转

    package main
    
    import (
        "fmt"
        "sort"
    )
    
    func testMapSort() {
        var a map[int]int
        a = make(map[int]int, 5)
        a[8] = 10
        a[3] = 10
        a[2] = 10
        a[1] = 10
        a[18] = 10
        var keys []int
        for k, _ := range a {
            keys = append(keys, k)
    
        }
        sort.Ints(keys)
        for _, v := range keys {
            fmt.Println(v, a[v])
        }
    }
    //map反转
    func testMapSort1() {
        var a map[string]int
        var b map[int]string
        a = make(map[string]int, 5)
        b = make(map[int]string, 5)
        a["abc"] = 101
        a["efg"] = 10
        for k, v := range a {
            b[v] = k
        }
        fmt.Println(b)
    }
    func main() {
        //testMapSort()
        testMapSort1()
    }
    map 键值反转
  • 相关阅读:
    idea双击打不开没反应的解决办法
    Golang Learn Log #0
    获取请求header的各种方法
    Linux 指令
    Windows下Anaconda的安装和简单使用
    如何把Python脚本导出为exe程序
    C++星号的含义
    仓库盘点功能-ThinkPHP_学习随笔
    详解html中的元老级元素:“table”
    IE在开发工具启动的情况下(打开F12)时 JS才能执行
  • 原文地址:https://www.cnblogs.com/bubu99/p/12521682.html
Copyright © 2020-2023  润新知