1488 字
7 分钟
01、流程控制之跳出for循环
01、流程控制之跳出for循环
func main() { // 当i=5时就跳出for循环 for i := 0; i < 10; i++ { if i == 5 { break // 跳出for循环 } fmt.Println(i) } fmt.Println("over")
// 当i=5时,跳过此次for循环(不执行for循环内部的打印语句),继续下一次循环 for i := 0; i < 10; i++ { if i == 5 { continue // 继续下一次循环 } fmt.Println(i) } fmt.Println("over")}02、pointer
func main() { // 1. & : 取地址 n := 18 p := &n // 只赋值地址,不重新创建对象 fmt.Println(p) fmt.Printf("%T", p) // *int : int类型的指针
// 2: *: 根据地址取值 m := *p fmt.Println(m) fmt.Printf("%T", m) // *int : int类型的指针
var a1 *int // nil pointer fmt.Println(a1) var a2 = new(int) // new函数申请一个内存地址 fmt.Println(a2) fmt.Println(*a2) *a2 = 100 fmt.Println(*a2) a3 := 200 fmt.Println(a3)}03、map
func main() { var m1 map[string]int fmt.Println(m1 == nil) // 还没有初始化(没有在内存中开辟空间) m1 = make(map[string]int, 10) // 要估算好该map容量,避免在程序运行期间再动态扩容 m1["理想"] = 18 m1["jiwuming"] = 35
fmt.Println(m1) fmt.Println(m1["理想"]) // 约定成俗用ok接收返回的布尔值 fmt.Println(m1["娜扎"]) // 如果不存在这个key拿到对应值类型的零值 value, ok := m1["娜扎"] if !ok { fmt.Println("查无此key") } else { fmt.Println(value) }
// map的遍历 for k, v := range m1 { fmt.Println(k, v) } // 只遍历key for k := range m1 { fmt.Println(k) } // 只遍历value for _, v := range m1 { fmt.Println(v) } // 删除 delete(m1, "jiwuming") fmt.Println(m1) delete(m1, "沙河") // 删除不存在的key}
func main() { rand.Seed(time.Now().UnixNano()) //初始化随机数种子
var scoreMap = make(map[string]int, 200)
for i := 0; i < 100; i++ { key := fmt.Sprintf("stu%02d", i) //生成stu开头的字符串 value := rand.Intn(100) //生成0~99的随机整数 scoreMap[key] = value }
fmt.Println(scoreMap) //取出map中的所有key存入切片keys var keys = make([]string, 0, 200) for key := range scoreMap { keys = append(keys, key) } // //对切片进行排序 sort.Strings(keys) //按照排序后的key遍历map for _, key := range keys { fmt.Println(key, scoreMap[key]) }}04、map和slice组合
// map和slice组合func main() { // 元素类型为map的切片 var s1 = make([]map[int]string, 10, 20) fmt.Println(s1) // 没有对内部的map做初始化 s1[0] = make(map[int]string, 1) s1[0][10] = "沙河" fmt.Println(s1) // 值为切片类型的map key为字符串类型,value为数组类型 var m1 = make(map[string][]int, 10) m1["北京"] = []int{10, 20, 30} m1["北京"] = []int{10, 20, 30} fmt.Println(m1)}05、函数
// 函数
// 函数存在的意义?// 函数是一段代码的封装// 把一段逻辑抽象出来封装到一个函数中,给它起个名字,每次用到它的时候直接用函数名调用就可以了// 使用函数能够让代码结构更清晰、更简洁。
// 函数的定义func sum(x int, y int) (ret int) { return x + y}
// 没有返回值func f1(x int, y int) { fmt.Println(x + y)}
// 没有参数没有返回值func f2() { fmt.Println("f2")}
// 没有参数但有返回值的func f3() int { ret := 3 return ret}
// 返回值可以命名也可以不命名
// 命名的返回值就相当于在函数中声明一个变量func f4(x int, y int) (ret int) { ret = x + y return // 使用命名返回值可以return后省略}
// 多个返回值func f5() (int, string) { return 1, "沙河"}
// 参数的类型简写:// 当参数中连续多个参数的类型一致时,我们可以将非最后一个参数的类型省略func f6(x, y, z int, m, n string, i, j bool) int { return x + y}
// 可变长参数// 可变长参数必须放在函数参数的最后func f7(x string, y ...int) { fmt.Println(x) fmt.Println(y) // y的类型是切片 []int}
// Go语言中函数没有默认参数这个概念
func main() { r := sum(1, 2) fmt.Println(r)
_, n := f5() fmt.Println(n)
f7("下雨了") f7("下雨了", 1, 2, 3, 4, 5, 6, 7)}总结
func main() { // var name string // name = "理想" // fmt.Println(name) // var ages [30]int // 声明了一个变量ages,它是[30]int类型 // ages = [30]int{1, 2, 3, 4, 6} // fmt.Println(ages) // var ages2 = [...]int{1, 2, 3, 4, 5, 7, 8, 90} // fmt.Println(ages2) // var ages3 = [...]int{1: 100, 99: 200} // fmt.Println(ages3) // // 二维数组 // var a1 = [...][2]int{ // [2]int{1, 2}, // [2]int{3, 4}, // [2]int{5, 6}, // } // fmt.Println(a1) // // 多维数组只有最外层可以使用...
// // 数组是值类型
// x := [3]int{1, 2, 3} // y := x // ? 把x的值拷贝了一份给了y // y[1] = 200 // 修改的是副本y,并不影响x
// fmt.Println(x) // [1 2 3] // f1(x) // fmt.Println(x) // ?[1 2 3]
// 切片(Slice): // var s1 []int // 没有分配内存, == nil // fmt.Println(s1) // fmt.Println(s1 == nil) // s1 = []int{1, 2, 3} // fmt.Println(s1) // // make初始化 分配内存 // s2 := make([]bool, 2, 4) // fmt.Println(s2) // [false false] // s3 := make([]int, 0, 4) // fmt.Println(s3 == nil)
// s1 := []int{1, 2, 3} // [1 2 3] // s2 := s1 // var s3 = make([]int, 3, 3) // copy(s3, s1) // fmt.Println(s2) // [1 2 3] // s2[1] = 200 // fmt.Println(s2) // [1 200 3] // fmt.Println(s1) // [1 200 3] // fmt.Println(s3) // ?[1 2 3]
// var s1 []int // nil // // s1 = make([]int, 1) // // s1[0] = 100 // // fmt.Println(s1) // s1 = append(s1, 1) // 自动初始化切片 // fmt.Println(s1)
// 指针 // Go里面的指针只能读不能修改,不能修改指针变量指向的地址 // addr := "沙河" // addrP := &addr // fmt.Println(addrP) // 内存地址 // fmt.Printf("%T\n", addrP) // addrV := *addrP // 根据内存地址找值 // fmt.Println(addrV)
// map var m1 map[string]int fmt.Println(m1 == nil) m1 = make(map[string]int, 10) m1["理想"] = 100 fmt.Println(m1) fmt.Println(m1["ji"]) // 如果key不存在返回的是value对应类型的零值 // 如果返回值是布尔型,我们通常用ok去接收它 score, ok := m1["ji"] if !ok { fmt.Println("没有姬无命这个人") } else { fmt.Println("姬无命的分数是", score) } delete(m1, "lixiang") // 删除的key不存在什么都不干 delete(m1, "理想") fmt.Println(m1) fmt.Println(m1 == nil) // 已经开辟了内存}
func f1(a [3]int) { // Go语言中的函数传递的都是值(Ctrl+C Ctrl+V) a[1] = 100 // 此处修改的是副本的值} 01、流程控制之跳出for循环
https://blog.zhequtao.com/posts/golang/go-new/base/base02/