Go语言基础语法_2_2021-10-29

用户数据输入

  从命令行中输入一个变量,如果是String类型是没有问题,但是int类型,目前得出错误的值 。

package main

import "fmt"

func main() {
    var name string
    fmt.Println("请输入名字 :")
    fmt.Scan(&name)

    fmt.Println("你输入的名字是:" + name)

    var age int
    fmt.Println("请输入的年龄 ")
    fmt.Println(&age)
    fmt.Println("你输入的年龄是", age)

    var height float64
    fmt.Println("请输入身高:")
    fmt.Scan(&height)
    fmt.Println("身高", height)

}

输出结果:
请输入名字 :
ioewi
你输入的名字是:ioewi
请输入的年龄 
0xc0000b2018
你输入的年龄是 0
请输入身高:
b
身高 0
流程控制

我们经常需要代码在满足一定条件进进行执行,或者需要重复执行代码多次,此时需要选择条件语句 (if-else ,if-sele )或选择语句。

条件语句的笑话:
程序员老婆给程序员打电话,下班回家买10个包子,如果看到西瓜,买一个。
程序员到家,买了一个包子;
老婆怒道:你怎么只买了一个包子。
程序员说:你不是说我看到西瓜,就买一个包子。

if
package main

import "fmt"

func main() {

    var yes string
    fmt.Scan(&yes)
    fmt.Println("老婆的想法:")
    fmt.Println("十个包子")

    if yes == "Y" || yes == "y" {
        fmt.Println("买一个西瓜")
    }

    fmt.Println("老公的想法 ")
    if yes == "Y" || yes == "y" {
        fmt.Println("买成一个包子")
    } else {
        fmt.Println("买10个包子")
    }

    var score int
    fmt.Println("请输入成绩:")
    fmt.Scan(&score)
    if score >= 90 {
        fmt.Println("A")
    } else if score >= 80 {
        fmt.Println("B")
    } else if score >= 70 {
        fmt.Println("C")
    } else if score >= 60 {
        fmt.Println("D")
    } else {
        fmt.Println("F")
    }

}


switch
package main

import "fmt"

func main() {
	var yes string
	fmt.Scan(&yes)
	fmt.Println("老婆的想法:")
	fmt.Println("十个包子")

	switch yes {
	case "Y", "X": //可以写多个变量,Java中只允许写一个变量
		fmt.Println("买一个西瓜")
		break
	case "y":
		fmt.Println("买两个西瓜")
		break
	default:
		fmt.Println("什么都不买")
		break

	}

	var score int
	fmt.Println("请输入成绩:")
	fmt.Scan(&score)
	switch {
	case score >= 90:
		fmt.Println("A")
	case score >= 80:
		fmt.Println("B")
	case score >= 70:
		fmt.Println("C")
	default:
		fmt.Println("F")
	}
}


for
package main

import "fmt"

func main() {

    //索引 => 记录已经加到的n
    sum := 0
    // 初始化子语句 ,条件子语句 ,后置子语句
    for i := 0; i < 100; i++ {
        sum += i
    }
    fmt.Println(sum)

    sum = 0

    i := 0
    for i <= 100 {
        sum += i
        i++
    }
    fmt.Println(sum)

    for { //表示一个死循环
        i++
        if i > 3000 {

            break
        }
    }
    desc := "我爱中国"
    // 字符串,数组,切片,映射,管道 ,如果遍历一个字符串,只能用for range去遍历
    for i,ch := range  desc {
        fmt.Printf("%T %q\n",i,ch)
    }
}
goto
package main

import "fmt"

func main() {

    /*  var yes string
            fmt.Println("请输入你的操作:(y 或 Y)")

            fmt.Scan(&yes)

            if yes != "Y" || yes != "y" {
                goto end
            }

            fmt.Println("买一个西瓜")

        end:
    */

    // 1... 100
    i := 0
    sum := 0
start:
    if i > 100 {
        fmt.Println("执行结束 ")
        goto forward
    }
    sum += i
    i++
    fmt.Println("i=", i)
    goto start
forward:
    fmt.Println("sum is ", sum)

    for i := 0; i < 10; i++ {
        for j := 0; j < 10; j++ {
            if j == 5 {
                //break只能跳出本层循环
                break
            }
            fmt.Println(i, j)
        }
    }
    
    //如果跳出多层循环,可以使用beak  begain
begain:
    for i := 0; i < 10; i++ {
        for j := 0; j < 10; j++ {
            if j == 5 {
                //break只能跳出本层循环
                break begain
            }
            fmt.Println(i, j)
        }
    }
}

作业 :

  1. 打印乘法口诀
package main

import "fmt"

func main() {
    /**
    1 * 1 = 1
    1 * 2 = 2 2 * 2 = 4
    1* 3 = 3 2 * 3 = 6   3 * 3 = 9
    .......
    1*9 = 9  ............9 * 9 = 81
    */
    for i := 1; i <= 9; i++ {
        for j := 1; j <= i; j++ {
            // - 号表示左对齐   , 2 表示占位2 个字符
            fmt.Printf("%d * %d = %-2d\t",j,i, i*j)
        }
        fmt.Println("")

    }
}
1 * 1 = 1       
1 * 2 = 2       2 * 2 = 4       
1 * 3 = 3       2 * 3 = 6       3 * 3 = 9       
1 * 4 = 4       2 * 4 = 8       3 * 4 = 12      4 * 4 = 16      
1 * 5 = 5       2 * 5 = 10      3 * 5 = 15      4 * 5 = 20      5 * 5 = 25      
1 * 6 = 6       2 * 6 = 12      3 * 6 = 18      4 * 6 = 24      5 * 6 = 30      6 * 6 = 36      
1 * 7 = 7       2 * 7 = 14      3 * 7 = 21      4 * 7 = 28      5 * 7 = 35      6 * 7 = 42      7 * 7 = 49      
1 * 8 = 8       2 * 8 = 16      3 * 8 = 24      4 * 8 = 32      5 * 8 = 40      6 * 8 = 48      7 * 8 = 56      8 * 8 = 64      
1 * 9 = 9       2 * 9 = 18      3 * 9 = 27      4 * 9 = 36      5 * 9 = 45      6 * 9 = 54      7 * 9 = 63      8 * 9 = 72      9 * 9 = 81   


  1. 猜数字游戏
    a) 生成一个[0,100)的随机数
    b)让用户重复猜5次(从命令行输入,当数字太大,提示太大,猜的太小,提示太小,你还有N次猜测机动,猜中了,提示猜中了,如果5都没有猜中的话,则提示你的没有猜中)
    挑站,当5次都没有猜中的话,提示太笨,重新开始新的猜数游戏
package main

import (
    "fmt"
    "math/rand"
    "time"
)

func main() {
    //设置随机数种子
    rand.Seed(time.Now().Unix())

    // 生成随机数 0-100
    guess := rand.Intn(100)
    const maxGuessNum = 5
    fmt.Println("生成的随机数:" ,guess)
start:
    for i := 0; i < maxGuessNum; i++ {
        var input int
        fmt.Println("请输入你猜中的数字")
        fmt.Scan(&input)

        if guess == input {
            fmt.Println("太聪明了 ,你第%d次就猜对了", i+1)
            break
        } else if guess > input {
            fmt.Println("你猜的数字太小了,你还有%d次猜的机会", maxGuessNum-i-1)
        } else {
            fmt.Println("你猜的数字太了,你还有%d次猜的机会", maxGuessNum-i-1)
        }
        if i == maxGuessNum-1 {
            fmt.Println("太笨了,你还要来一次吗?如果需要输入Y,否则输入Other,退出游戏")
            var flag string
            fmt.Scan(&flag)
            if flag == "Y" {
                goto start
            } else {
                goto end
            }
        }
    }
end:
    fmt.Println("游戏结束 ")

}

写代码注意 :

  • 随机种子,在程序初始化只用初始化一次
  • 清楚了解代码执行逻辑,删除冗余
  • 注意变量定义的位置。
  • 注意变量定义的位置。
  • 注意代码格式 (缩进和对齐)
  • 注意对不同的分支中相同的逻辑代码进行合并
  • 尝试,fmt.printLn(),fmt.println(""),fmt.printf("\n")
  • 掌握fmt.Printf对齐方式
  • 代码要做减法,使得逻辑最清晰
数组

数组是相同的数据类型,的数据项目组成的一组长度固定的序列,数组的元素,数组的长度必需是非负整数的常量,长度也是类型是之一 。
声明:
数组的声明需要指定组成元素的类型以及存储元素的数量(长度 ),其长度不可以修改,数组的每个元素会根据对应的类型的零值进行

var names [10] string
var score [10] int

fmt.Printf("%T,%T\n",names,scores)
fmt.Printf("%q\n",names)
fmt.Println(scores)

例子:

package main

import "fmt"

func main() {
    var nums [10]int
    fmt.Println(nums)         // [0 0 0 0 0 0 0 0 0 0]
    fmt.Printf("%q \n", nums) //['\x00' '\x00' '\x00' '\x00' '\x00' '\x00' '\x00' '\x00' '\x00' '\x00']
    fmt.Printf("%T \n", nums) // [10]int

    var t2 [5]bool
    var t3 [3]string
    fmt.Println(t2)         // [false false false false false]
    fmt.Println(t3)         //[  ] ,看到什么都没有打印,其实是5个空字符串
    fmt.Printf("%q \n", t3) // ["" "" ""] ,将对应类型的零值进行填充

    // 字面量,数组初始化
    nums = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    fmt.Println(nums) // [1 2 3 4 5 6 7 8 9 10]
    // 给数组的第一个和最后一个赋值,[10 0 0 0 0 0 0 0 0 20]
    nums = [10]int{0: 10, 9: 20}
    fmt.Println(nums)
    // 可以根据... 去推算数组的长度
    nums = [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} //[1 2 3 4 5 6 7 8 9 10]
    fmt.Println(nums)
    // 定义一个数组长度为3的数组,可以不定义他的长度,可以用...来代替,可以根据数组的长度来推导出xx的长度
    xx := [...]int{1, 2, 3}
    fmt.Println(xx) //[1 2 3]

    //初始化数组的前三个元素的数组
    nums02 := [10]int{10, 20, 30}
    fmt.Println(nums02)                    // [10 20 30 0 0 0 0 0 0 0]
    fmt.Printf("%T %#v\n", nums02, nums02) //[10]int   [10]int{10, 20, 30, 0, 0, 0, 0, 0, 0, 0}

    //数组的声明也赋值
    nums03 := [...]int{1, 2}
    fmt.Printf("%T %#v\n", nums03, nums03) // [2]int       [2]int{1, 2}

    //获取数组的长度,数组的长度一旦定义了,就不能改变了
    fmt.Println("获取数组的长度",len(nums))                    // 10
    // 遍历数组
    for i := 0; i < len(nums03); i++ {
        fmt.Println(nums03[i])
    }
    nums04 := [3]int{1, 2, 3}
    nums05 := [3]int{1, 2, 3}
    nums06 := [4]int{1, 2, 3, 4}
    nums07 := [4]int{1, 3, 4, 5}
    fmt.Println(nums04 == nums05) // true
    // invalid operation: nums04 == nums06 (mismatched types [3]int and [4]int) ,如果长度不相等,编译报错
    //fmt.Println(nums04 == nums06)
    fmt.Println(nums06 == nums07)                       //false

    //索引,访问元素必需在索引范围之内
    fmt.Println("nums04的第一个元素 :",nums04[0]) // nums04的第一个元素 : 1

    //fmt.Println(nums04[-1]) Invalid array index '-1' (must be non-negative)
    nums04[0],nums04[1] = 1000,2000 //同时给数组中的元素赋值

    for index,value := range nums04{
        fmt.Println(index,value)
    }
    //0 1000
    //1 2000

    var value int       //for里面的作用域和外部的作用域是不一样的
    //只想获取值,不想要index,那可以以一个空白标识符来标识,来丢弃不想要的值
    for _,value :=range nums04{
        fmt.Println(value)
    }
    fmt.Println(value)

    /*  var value int
    _,value = 1,4
    fmt.Println(value)*/
    // 切片
    fmt.Printf("%T \n",nums04[0:]) //[]int
    // [2000 3]
    fmt.Println(nums04[1:])
    //切片的容量,不能超过数组的长度
    //fmt.Println(nums04[1:4])
    fmt.Println("--------------------")
    // 最后一个参数是数组的容量
    fmt.Println(nums04[1:3:3])

    fmt.Printf("%v \n",nums04[1:3]) // [2000 3]

    // 多维数组
    //定义一个长度为2
    var marrays =  [3][2]int{{1,2},{3,4},{5,6}}
    fmt.Println(marrays)            // [[1 2] [3 4] [5 6]]
    fmt.Printf("%T\n",marrays)          // [3][2]int
    marrays[0] = [2]int{1,3}        // 修改第一维数组
    fmt.Println(marrays)
    marrays[1][1] = 1000
    fmt.Println(marrays)    //[[1 3] [3 1000] [5 6]]

    //定义三维数组,多维数组不能用可推导长度,多维数组的长度一定要是一一致的,数组的类型必需是一致的
    var marray3 = [4][3][2] int{{{1,2},{3,4},{5,6}},{{7,8},{9,10},{11,12}},{{13,14},{15,16},{17,18}},{{19,20},{21,22},{23,24}}}
    fmt.Println(marray3) // [[[1 2] [3 4] [5 6]] [[7 8] [9 10] [11 12]] [[13 14] [15 16] [17 18]] [[19 20] [21 22] [23 24]]]

}



复合数组类型
字面量:

  • 指定数组长度 :[length]type{v1,v2,…vlength}
  • 使用初始化元素数量推到数组长度:[…]type{v1,v2…}
  • 对指定位置的元素进行初始化:[length]type[im:vm…]
切片:

切片是长度可变的数组(具体相同的数据类型的数据项,)切片由三部分组成

  • 指针:指向切片第一个元素指向的数组元素地址
  • 切片的元素的数量
  • 容量:切片开始到结束位置元素的位置

声明:切片声明需要指定组成的元素的类型,但不需要指定存储元素的数量(长度),在切片声明后,会被初始化为nil,表示暂时不存在切片 。

array[start:end]/array[start🔚cap]( end <= cap)

初始化

  • 使用字面量初始化:[]type{v1,v2,…vn}
  • 使用字面量初始化空切片 ,[] type{}
  • 指定长度和容易字面量初始化:[]type{im:vm,in,vnm}
  • 使用make函数初始化 :make([]type,len/make([]type,len,cap),通过make函数创建长度为len,容量为cap的切片,len的长度小于等于cap)
  • 使用数组切片操作的初始化 ,array[start:end]或array[start:end :cap]

可以通过len和cap来获取数组的长度和容量
可以通过索引对切片元素进行访问,和修改切片里的元素
新创建切片的长度和容易计算:len:end-start,cap:src_cap-start
切片的共享底层数组,若某个切片元素发生变量,则数组和其他切片也会发生变化 。
新创建切片长度和容易计算:len:end-start,cap=len:end-start,cap:cap-start
可以用for len或for range来遍历切片
len :
len函数是Go语言中的内置函数

package main

import (
    "fmt"
)

func main() {
    //声明一个切片
    var nums []int
    fmt.Printf("%T %d %d \n", nums, len(nums), cap(nums)) //[]int 0 0

    var names []string
    fmt.Printf("%T %d %d %d \n", names, names == nil, len(names), cap(names)) // []string %!d(bool=true) 0 0

    // 字面量
    nums = []int{1, 2, 3}
    fmt.Println(nums) // [1 2 3]

    nums = []int{1, 2, 3, 4}                                //[1 2 3]
    fmt.Printf("%#v  %d %d \n", nums, len(nums), cap(nums)) // []int{1, 2, 3, 4} 4 4

    //通过数组切片赋值
    var arrays [10]int = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    nums = arrays[1:10]
    fmt.Println(nums) //通过数组切片,  [2 3 4 5 6 7 8 9 10]

    // make 函数,第一个参数是类型,第三个参数,是长度,第三个参数是容量
    nums = make([]int, 3)                                  //在底层初始化一个长度为3的数组,赋值给这个切片
    fmt.Printf("%#v %d %d \n", nums, len(nums), cap(nums)) // []int{0, 0, 0} 3 3
    fmt.Println(nums)

    nums = make([]int, 3, 5) //初始化前面三个参数是0,后面两个参数没有被初始化
    fmt.Println(nums)        // [0 0 0]

    // 元素的操作(增,删,改,查)
    fmt.Println(nums[0]) // 0
    fmt.Println(nums[1]) //0
    nums[2] = 4
    //  fmt.Println(nums[3])                // panic: runtime error: index out of range [3] with length 3
    //fmt.Println(nums[4])
    //nums[3]= 4                        //
    // 为nums添加一个值
    nums = append(nums, 1)

    fmt.Printf("%#v %d %d \n", nums, len(nums), cap(nums)) // []int{0, 0, 4, 1} 4 5
    nums[3] = 10
    fmt.Println(nums) // [0 0 4 10]
    //  nums[5]=6                           // panic: runtime error: index out of range [5] with length 4

    nums = append(nums, 1)
    nums = append(nums, 1)
    nums = append(nums, 1)
    fmt.Println(nums) // [0 0 4 10 1 1 1]

    // 切片遍历
    for _, value := range nums {
        fmt.Println(value)
    }

    // 切片操作
    nums = nums[1:5]
    fmt.Println(nums) //      [0 4 10 1]

    fmt.Println("%T \n", nums[1:5]) //  [4 10 1 1]

    nums = make([]int, 3, 10)
    n := nums[1:3:10] //设置的容量不能比原来的大
    //  长度是2  新的容量是 原来容量-start
    fmt.Printf("%T %#v  %d %d \n", n, n, len(n), cap(n)) // []int []int{0, 0}  2 9
    n = nums[2:3]
    // cap = src_cap - start
    fmt.Printf("%T %#v  %d %d \n", n, n, len(n), cap(n)) // []int []int{0}  1 8

    nums02 := nums[1:3]
    fmt.Println(nums02) // [0 0]
    nums02[0] = 1
    fmt.Println(nums02) // [1 0]
    // 删除
    // copy
    nums04 := []int{1, 2, 3}
    nums05 := []int{10, 20, 30, 40}
    //copy(nums05,nums04)
    //fmt.Println(nums05)                   // [1 2 3 40]
    copy(nums04, nums05)
    fmt.Println(nums04) // [10 20 30] 复制不会扩容

    // 删除 第一个元素和最后一个元素
    nums06 := []int{1, 2, 3, 4, 5, 6}
    fmt.Println(nums06[1:])             // [2 3 4 5 6]
    fmt.Println(nums06[:len(nums06)-1]) //[1 2 3 4 5]
    //删除中间的一个元素
    copy(nums06[2:], nums06[3:])
    fmt.Println(nums06[:len(nums06)-1]) // [1 2 4 5 6]

    // 堆栈:每次添加在除尾,移除元素在队尾,(先进后出)

    stack := []int{}
    stack = append(stack, 1)
    stack = append(stack, 2)
    stack = append(stack, 3)
    stack = append(stack, 4)
    fmt.Println(stack[:len(stack)-1])               // [1 2 3]

    //队列 :每次添加都在队尾,移除元素在除头,先进先出

    queue := []int{}
    queue = append(queue, 1)
    queue = append(queue, 2)
    queue = append(queue, 3)
    queue = append(queue, 4)
    fmt.Println(queue[0])             //1
    fmt.Println(queue[1:])            //[2 3 4]
    fmt.Println(queue[:len(queue)-1]) // [1 2 3]


	//数组的值的类型
	slice01 := []int{1,2,3}
	slice02 := slice01
}


sort
package main

import (
    "fmt"
    "sort"
)

func main() {

    nums := []int{4, 5, 7, 8, 6}
    sort.Ints(nums)
    //对nums排序
    fmt.Println(nums) // [4 5 6 7 8]

    names := []string{"test","name","zhangsan","lisi"}
    sort.Strings(names)//对字符串进行排序
    fmt.Println(names) //[lisi name test zhangsan]

    
    hight := []float64{1.2,1.0,2.5,3.2,2.3}
    sort.Float64s(hight) //对float类型进行排序
    fmt.Println(hight) // [1 1.2 2.3 2.5 3.2]


}


复合数组类型-映射(java中的hashmap)
定义:
映射是存储一系列无序的key/value对,通过key来对value进行操作(增,删,查)
key/value规则
映射的key只能为可使用==运算符值的类型(字符串,数字,布尔,数组)value可以为任意类型的s

package main

import (
    "fmt"
)

func main() {
    users := []string{"烟灰", "祥哥", "zhangsan", "lisi", "zhangsan", "wangwu", "zhaoliu", "zhangsan"}
    counts := map[string]int{}
    for _, user := range users {
        //fmt.Println(user)
        _, ok := counts[user]
        if !ok {
            counts[user] = 1
        } else {
            counts[user] = counts[user] + 1
        }
    }
    fmt.Println(counts) // map[lisi:1 wangwu:1 zhangsan:3 zhaoliu:1 烟灰:1 祥哥:1]

    counts1 := map[string]int{}
    for _, user := range users {
        counts1[user]++
    }
    fmt.Println(counts1) // map[lisi:1 wangwu:1 zhangsan:3 zhaoliu:1 烟灰:1 祥哥:1]


    dream := "I have a dream\n \nFive score years ago, a great American, in whose symbolic shadow we stand today, signed the Emancipation Proclamation. This momentous decree came as a great beacon";

    dreamMap := map[rune]int {}
    for _ ,v :=range  dream{
        dreamMap[v]++
    }

    for ch ,cnt := range dreamMap{
        fmt.Printf("%c %d \n",ch,cnt)
    }


}
g 43 
P 1 
G 3 
z 1 
C 2 
c 52 
w 40 
E 1 
l 97 
T 1 
O 3 
S 4 
...

7.字符串常用函数

  
字符串/字节切片
strings
string包提供了操作UTF-8字符串常用的函数 和结构体
a)常用函数
Compare:比较字符串
Contains:是否包含子字符串
Count: 子字符串出现的次数
EqualFold:不区分大小写怕比较
Fields:按空白字符串分割字符串
HasPrefix:是否以字符串作为前缀
HasSuffix:是否以字符串作为后缀
Index: 获取子字符串首次出现的位置
Split :分割字符串为切片
Join:将字符串切片连接
LastIndex:获取字符串最后一次出现的位置 。

package main

import (
    "fmt"
    "strings"
)

func main() {
    fmt.Println(strings.Compare("abc", "bad"))    // -1
    fmt.Println(strings.Contains("abc", "a"))     //true
    fmt.Println(strings.ContainsAny("abc", "cb")) //
    fmt.Println(strings.Count("abc", "a"))        //出现的次数
    fmt.Printf("%q \n", strings.Fields("abc cd")) //按空白字符分隔开 ,["abc" "cd"]

    fmt.Println(strings.HasPrefix("abc", "a")) // 以什么开头 true
    fmt.Println(strings.HasSuffix("bcd", "d")) // 以什么结尾

    fmt.Println(strings.Index("abc", "c"))      // 2 返回第一次出现的位置
    fmt.Println(strings.LastIndex("abac", "a")) // 2 返回最后一次出现的位置

    fmt.Println(strings.Split("abcdef", "e")) // [abcd f]
    a := []string{"a", "b", "c"}
    fmt.Println(strings.Join(a,"_")) // a_b_c               第一个参数是一个切片,第二个参数是连接的_


    fmt.Println(strings.Repeat("abc",3))                    // abcabcabc
    fmt.Println(strings.ReplaceAll("abcabcabc","ab","x"))   // xcxcxc ,将ab 替换成x
    fmt.Println(strings.Replace("abcabcabc","ab","x",1))    // xcabcabc ,将ab 替换成x,只替换一个
    fmt.Println(strings.Replace("abcabcabc","ab","x",-1))   // xcxcxc ,将ab 替换成x,-1,表示替换所有
    fmt.Println(strings.ToLower("ABC"))                 // abc
    fmt.Println(strings.ToUpper("abc")) //ABC 全部大写
    fmt.Println(strings.ToTitle("abc")) //ABC
    fmt.Println(strings.Trim("abc","c"))    //ab
    fmt.Println(strings.TrimSpace("abcxx iewoiew \t"))              //abcxx iewoiew 去前后的空白字符
   
}

8.字节切片

package main

import (
    "bytes"
    "fmt"
)

func main() {
    b := []byte{'a','b','c'}
    fmt.Printf("%T %#v\n", b) // []uint8 %!v(MISSING)
    fmt.Println(b)            // [97 98 99]


    s := string(b)
    fmt.Printf("%T %#v \n",s,s) // string "abc"


    fmt.Println(bytes.Compare([]byte{'a','b'},[]byte{'c','d'})) // -1

    fmt.Println(bytes.Index([]byte("abcdef"),[]byte("def"))) //3
    fmt.Println(bytes.Contains([]byte("abcdef"),[]byte("defd")))     //false
}
9.字符串类型转换
package main

import (
    "fmt"
    "strconv"
)

func main() {
    // 字符串=>其他类型
    // => bool
    if v, err := strconv.ParseBool("true"); err == nil {
        fmt.Println(v, err) // true 
    }
    //转化成int
    if v, err := strconv.Atoi("1023"); err == nil {
        fmt.Println(v) //1023
    }

    if v,err := strconv.ParseInt("64",16,64); err == nil {
        fmt.Println(v)                  // 100
    }

    //转化为64类型
    if v,err := strconv.ParseFloat("64.4 ",64); err == nil {
        fmt.Println(v)                  // 100
    }




    //其他类型向string类型转化

    xx :=fmt.Sprintf("%d",12)
    fmt.Println(xx)


    yy :=fmt.Sprintf("%.3f",12.32389328)
    fmt.Println(yy) // 12.324

    fmt.Println(strconv.FormatBool(false)) // false
    fmt.Printf("%q \n",strconv.Itoa(12)) //"12"
    fmt.Printf("%q \n",strconv.FormatInt(12,16)) //"c"
    fmt.Printf("%q \n",strconv.FormatFloat(10.1 ,'E',-1,64)) //"1.01E+01" ,用科学计数法来表示

}

10.冒泡排序
package main

import "fmt"

func main() {
    heights := []int {10,6,7,9,5}
    //先把最高的人排到最后
    for i := 0 ;i < len(heights);i ++{
        for j := i + 1  ; j < len(heights)  ; j ++{
            if heights[i] > heights[j]{
                heights[i],heights[j] = heights[j],heights[i]
            }
        }
    }
    fmt.Println(heights)
}

作业 :

代码github地址

求数组中的最大值到第二大值

package main

import "fmt"

func main() {
    numbs := []int{1, 3, 5, 8, 9, 11, 20, 30, 4, 6, 5}
    maxNum := numbs[0]
    secondNum := numbs[0]
    //求数组中的最大值到第二大值
    for _, v := range numbs {
        if v > maxNum {
            secondNum = maxNum
            maxNum = v
        } else if v > secondNum {
            secondNum = v
        }
    }
    fmt.Println(maxNum) //30 得到最大值
    fmt.Println(secondNum)

}


  1. 获取映射中的key切片,value切片
package main

import "fmt"

func main() {
    users := map[string]int{"zhangsan": 1, "lisi": 9, "wangwu": 10}
    keySlice := make([]string, len(users))
    valueSlice := []int{}
    i := 0
    for k, v := range users {
        keySlice[i] = k
        i++
        valueSlice = append(valueSlice, v)
    }
    for k,_ := range users{
        fmt.Println(k)
    }
    for _,v := range users{
        fmt.Println(v)
    }
    for v :=range users{
        fmt.Println(v)
    }
    for v:= range valueSlice{
        fmt.Println(v)
    }

}
  1. 我有一个梦想,每个字符出现的次数 run=>int ,出现多少次数的字符数
package main
import "fmt"
func main() {
    dream := "I have a dream\n \nFive score years ago, a great American, in whose symbolic shadow we stand today, signed the Emancipation Proclamation. This momentous decree came as a great beacon light of hope to millions of Negro slaves who had been seared in the."

    dreamMap := map[rune]int{}
    for _, v := range dream {
        dreamMap[v]++
    }
    countStats := map[int][]rune{}
    for ch, count := range dreamMap {
        countStats[count] = append(countStats[count], ch)
    }
    fmt.Println(countStats)
}
package main

import (
    "fmt"
    "sort"
)

func main() {

    nums := []int{1, 2, 3, 4, 5, 6, 8,  10, 11}
    sort.Ints(nums)
    fmt.Println(nums)
    // 二分查找,在有序的数组中查找元素
    index := sort.SearchInts(nums, 5)
    fmt.Println(index) // 4
    // 先查找这个值,是不是等于num,如果不存在,则找到这个如果插入时的索引
    fmt.Println(sort.SearchInts(nums, 1000))
    
    if  nums[sort.SearchInts(nums, 9)] == 9 {       //如果不存在,直接打印不存在
        fmt.Println("存在 ")
    }else{
        fmt.Println("不存在 ")
    }
}

https://github.com/quyixiao/go_learn.git

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值