Go学习交流

GO学习笔记06

2018-03-25  本文已影响18人  Q大疯zi

一、随机数和切片

1.随机数的生成

    package main
    
    import (
        "math/rand"
        "fmt"
        "time"
    )
    
    func main() {
        rand.Seed(666) //设置种子只需一次,并且每次产生的随机数都是一样的
        for i := 1; i <= 5; i++ {
            fmt.Println("rand = ", rand.Int())  //每次循环都生成一样的随机数
        }
    
        rand.Seed(time.Now().UnixNano()) //当前的系统时间作为种子
        for i := 1; i <= 5; i++ {
            fmt.Println("rand = ", rand.Intn(100)) //生产100以内的随机数,并且每次不一样
        }
    
    }
    
    
    rand =  4343637058903381868
    rand =  3769183255805726892
    rand =  1923662109321608638
    rand =  1818688891928401469
    rand =  4144162958715305555
    
    rand =  54
    rand =  35
    rand =  85
    rand =  76
    rand =  4

2.冒泡排序

    package main
    
    import (
        "math/rand"
        "time"
        "fmt"
    )
    
    func main() {
        rand.Seed(time.Now().UnixNano())
    
        var a [10]int
        n := len(a)
    
        for i := 0; i < n; i++ {
            a[i] = rand.Intn(100)
            fmt.Printf("%d, ", a[i])
        }
        fmt.Println("\n")
    
        for i := 0; i < n-1; i++ {
            for j := 0; j < n-1-i; j++ {
                if a[j] > a[j+1] {
                    a[j], a[j+1] = a[j+1], a[j]
                }
            }
        }
        fmt.Println("---------")
    
        for i := 0; i < n; i++ {
            fmt.Printf("%d, ", a[i])
        }
        fmt.Printf("\n")
    
    }
    
    99, 10, 14, 7, 14, 27, 57, 20, 50, 41, 
    
    ---------
    7, 10, 14, 14, 20, 27, 41, 50, 57, 99, 

3.数组的值传递和地址传递

    package main
      
      import "fmt"
      
      func main() {
        a := [5]int{1, 2, 3, 4, 5}
        modify(a)
        fmt.Println("main: a = ", a)
      
      }
      func modify(ints [5]int) {
        ints[0] = 666
        fmt.Println("modify: ints =", ints)
      }
      
      modify: ints = [666 2 3 4 5]
      main: a =  [1 2 3 4 5]
    package main
      
      import "fmt"
      
      func main() {
        a := [5]int{1, 2, 3, 4, 5}
        modify(&a)
        fmt.Println("main: a = ", a)
      
      }
      func modify(ints *[5]int) {
        (*ints)[0] = 666
        fmt.Println("modify: ints =", ints)
      }
      
      
      modify: ints = &[666 2 3 4 5]
      main: a =  [666 2 3 4 5]

4.切片slice

    package main
      
      import "fmt"
      
      func main() {
        a := []int{1, 2, 3, 4, 5}
        s := a[0:3:5] //0代表从下标为0的元素开始,一共取值3-0 3个元素,容量为5
        fmt.Println("s = ", s)
        fmt.Println("len(s) = ", len(s))
        fmt.Println("cap(s) = ", cap(s))
      
        s = a[1:4:5] //从下标为1的元素开始取3个值,容量为5
        fmt.Println("s = ", s)
        fmt.Println("len(s) = ", len(s))
        fmt.Println("cap(s) = ", cap(s))
      
      }
      
      
      s =  [1 2 3]
      len(s) =  3
      cap(s) =  5
      s =  [2 3 4]
      len(s) =  3
      cap(s) =  4

5.切片和数组的区别

    package main
      
      import "fmt"
      
      func main() {
        a := [5]int{}
        fmt.Printf("len = %d, cap = %d\n", len(a), cap(a))
      
        s := []int{}
        fmt.Printf("切片: len = %d , cap = %d\n", len(s), cap(s))
      
        s = append(s, 999) //给切片末尾追加一个成员
        fmt.Printf("切片append后: len = %d , cap = %d\n", len(s), cap(s))
      
      }
      
      len = 5, cap = 5
      切片: len = 0 , cap = 0
      切片append后: len = 1 , cap = 1

6.切片的定义

    package main
      
      import "fmt"
      
      func main() {
        s := []int{1, 2, 3, 4}
        fmt.Println("s = ", s)
      
        //借助make函数,格式 male(切片类型,长度,容量)
        s1 := make([]int, 5, 34)
        fmt.Printf("len = %d, cap = %d\n", len(s1), cap(s1))
      
        //没有指定容量,容量和长度一样
        s2 := make([]int, 5)
        fmt.Printf("len = %d, cap = %d\n", len(s2), cap(s2))
      
      }
      func main01() {
        a := [5]int{}
        fmt.Printf("len = %d, cap = %d\n", len(a), cap(a))
      
        s := []int{}
        fmt.Printf("切片: len = %d , cap = %d\n", len(s), cap(s))
      
        s = append(s, 999) //给切片末尾追加一个成员
        fmt.Printf("切片append后: len = %d , cap = %d\n", len(s), cap(s))
      
      }
      
      
      s =  [1 2 3 4]
      len = 5, cap = 34
      len = 5, cap = 5

7.切片的截取

    package main
      
      import (
        "fmt"
      )
      
      func main() {
        array := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
        s1 := array[:] //不指定,长度和容量一样
        fmt.Println("s1 = ", s1)
        fmt.Printf("len = %d, cap = %d\n", len(s1), cap(s1))
      
        //操作某个元素
        data := array[1]
        fmt.Println("data = ", data)
      
        s2 := array[3:6:7]
        fmt.Println("s2 = ", s2)
        fmt.Printf("len = %d, cap = %d\n", len(s2), cap(s2))
      
        s3 :=array[:6]      //[0,6)
        fmt.Println("s3 = ", s3)
        fmt.Printf("len = %d, cap = %d\n", len(s3), cap(s3))
      
        s4 :=array[4:]
        fmt.Println("s4= ", s4)
        fmt.Printf("len = %d, cap = %d\n", len(s4), cap(s4))
      
      
      
      }
      
      s1 =  [1 2 3 4 5 6 7 8 9]
      len = 9, cap = 9
      data =  2
      s2 =  [4 5 6]
      len = 3, cap = 4
      s3 =  [1 2 3 4 5 6]
      len = 6, cap = 9
      s4=  [5 6 7 8 9]
      len = 5, cap = 5

8.切片append的规则

     package main
      
      import "fmt"
      
      func main() {
        //如果超过了原来的容量,通常以2倍的容量扩容
        s := make([]int, 0, 1)
        oldCap := cap(s)
        for i := 0; i < 8; i++ {
            s = append(s, i)
            if newCap := cap(s); oldCap < newCap {
                fmt.Printf("cap: %d====> %d\n", oldCap, newCap)
                oldCap = newCap
            }
        }
      
      }
      
      cap: 1====> 2
      cap: 2====> 4
      cap: 4====> 8

9.copy的使用

     package main
      
      import "fmt"
      
      func main() {
        srcSlice := []int{1, 2}
        dstSlice := []int{6, 6, 6, 6, 6}
        copy(dstSlice, srcSlice)
        fmt.Println("dst = ", dstSlice)
      
      }
      
      
      dst =  [1 2 6 6 6]

10.切片作为函数参数

    package main
      
      import (
        "math/rand"
        "time"
        "fmt"
      )
      
      func InitData(s []int) {
        rand.Seed(time.Now().UnixNano()) //设置种子
        for i := 0; i < len(s); i++ {
            s[i] = rand.Intn(100) //产生100以内的随机数
        }
      }
      
      func BubbleSort(s []int) {
        n := len(s)
        for i := 0; i < n-1; i++ {
            for j := 0; j < n-1-i; j++ {
                if s[j] > s[j+1] {
                    s[j], s[j+1] = s[j+1], s[j]
                }
            }
        }
      }
      
      func main() {
        n := 10
        //创建一个切片,len为n
        s := make([]int, n)
        InitData(s)
        fmt.Println("排序前=", s)
      
        BubbleSort(s)
        fmt.Println("排序后=", s)
      }
      
      
      排序前= [88 38 48 41 16 24 33 72 88 34]
      排序后= [16 24 33 34 38 41 48 72 88 88]

11.猜数字的游戏

    package main
      
      import (
        "fmt"
        "math/rand"
        "time"
      )
      
      func main() {
        var randNum int
        CreatNum(&randNum)
        fmt.Println("randNum: ", randNum)
      
        randSlice := make([]int, 4)
        GetNum(randSlice, randNum)
        fmt.Println("randslice:", randSlice)
      
        OnGame(randSlice)
      }
      
      func OnGame(randSlice []int) {
        var num int
        keySlice := make([]int, 4)
        for {
            for {
                fmt.Printf("请输入一个四位数")
                fmt.Scan(&num)
                if 999 < num && num < 10000 {
                    break
                }
                fmt.Println("输入的数不符合要求")
            }
            //fmt.Println("num =", num)
      
            GetNum(keySlice, num)
            //fmt.Println("keySlice: ", keySlice)
            n := 0
            for i := 0; i < 4; i++ {
                if keySlice[i] > randSlice[i] {
                    fmt.Printf("第%d位大了\n", i+1)
                } else if keySlice[i] < randSlice[i] {
                    fmt.Printf("第%d位小了\n", i+1)
                } else {
                    fmt.Printf("第%d猜对了\n", i+1)
                    n++
                }
            }
            if n == 4 {
                fmt.Println("恭喜你,全部正确")
                break
            }
        }
      }
      
      func GetNum(s []int, num int) {
        s[0] = num / 1000
        s[1] = num % 1000 / 100
        s[2] = num % 100 / 10
        s[3] = num % 10
      }
      func CreatNum(p *int) {
        rand.Seed(time.Now().UnixNano())
        var num int
        for {
            num = rand.Intn(10000)
            if num > 1000 {
                break
            }
        }
      
        *p = num
      }
    // randNum:  2634
      // randslice: [2 6 3 4]
      请输入一个四位数1234
      第1位小了
      第2位小了
      第3猜对了
      第4猜对了
      请输入一个四位数5234
      第1位大了
      第2位小了
      第3猜对了
      第4猜对了
      请输入一个四位数2534
      第1猜对了
      第2位小了
      第3猜对了
      第4猜对了
      请输入一个四位数2634
      第1猜对了
      第2猜对了
      第3猜对了
      第4猜对了
      恭喜你,全部正确
上一篇下一篇

猜你喜欢

热点阅读