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/
作者
阿俊
发布于
2020-03-30
许可协议
CC BY-NC-SA 4.0

相关阅读