1. 跳出/执行下一次循环。

{标签名}:
for true {
...
for true {
...
break/continue {标签名} //默认不加标签,则跳出最近一层循环。加了标签可以跳出标签定义处所在循环
}
}

2. map的使用注意项。

因为map是指针,作为参数传递时,在函数内部对map作的修改直接修改外部传递变量的值。

3. slice(切片)使用注意点。

与map一样,都可以用make创建,但slice返回的是结构体。当slice作为参数传递时,在函数内部修改可能会影响slice

4. 遍历循环for range和排序sort的使用。

package main

import (
"fmt"
"sort"
) func main() {
sl := []int{219, 373, 543, 351, 523, 625, 436, 252, 121, 567, 896, 454, 342, 734, 464, 423, 164}
min, max := getMinAndMax(sl)
fmt.Println("sl中最小值:", min)
fmt.Println("sl中最大值:", max)
sort.Ints(sl) //根据类型进行正向排序
fmt.Println("切片排序获取sl中最小值:", sl[0])
fmt.Println("切片排序获取sl中最大值_1:", sl[len(sl)-1:][0])
sort.Sort(sort.Reverse(sort.IntSlice(sl))) //反射排序
fmt.Println("切片排序获取sl中最大值_2:", sl[0])
} func getMinAndMax(arr []int) (min int, max int) {
if len(arr) == 0 {
return
}
min, max = arr[0], arr[0]
for _, v := range arr {
if v > max {
max = v
} else if v < min {
min = v
}
}
return
}

上面代码执行结果:

sl中最小值: 121
sl中最大值: 896
切片排序获取sl中最小值: 121
切片排序获取sl中最大值_1: 896
切片排序获取sl中最大值_2: 896

5. defer用法。

defer是函数退出前必须执行逻辑,类似栈,后进先出,最后执行要先写
package main

import (
"fmt"
) func main() {
fmt.Println("start...")
for i := 0; i < 3; i++ {
defer fmt.Println(i)
}
fmt.Println("end")
}

上面代码执行结果:

start...
end
2
1
0

defer函数实参是值拷贝进去,所以i++不影响defer中的值。

注意:return之后的defer不会执行;调用os.Exit(1)的函数不执行defer。

package main

import (
"fmt"
)
//return后写defer
func main() {
fmt.Println("start...")
return
defer fmt.Println("defer逻辑")
fmt.Println("end")
}
//函数中使用了os.Exit(1)
func main() {
fmt.Println("start...")
defer fmt.Println("defer逻辑")
fmt.Println("end")
os.Exit(1)
}

6. 匿名函数用法。

package main

import (
"fmt"
"time"
) var FunB = func() {
fmt.Println("全局匿名函数")
} func main() {
fmt.Println("start...")
go func() {
fmt.Println("匿名函数")
}()
a := func() {
fmt.Println("给变量赋值的匿名函数")
}
go a()
go FunB()
time.Sleep(1 * time.Second)
fmt.Println("end")
}

7. defer + recover捕获panic,不会让一个panic使整个app程序奔溃的简单方法,提高程序的健壮性。

package main

import "fmt"

func main() {
testPanic()
fmt.Println("test_end")
} func testPanic() {
defer func() {
err := recover()
if err != nil {
fmt.Println("panic被捕获")
}
}()
a := 10
b := 0
fmt.Println("a/b=", a/b)
}

8. 自定义错误。

errors.New("自定义错误内容")

9. 自定义函数进行多函数单一操作。

package main

import "fmt"

func add(a, b int) int {
return a + b
}
func sub(a, b int) int {
return a - b
}
func nul(a, b int) int {
return a * b
} type Op func(int, int) int func do(f Op, a, b int) int {
return f(a, b)
} func main() {
c, d := 102087, 65421
e := do(add, c, d)
fmt.Println("c+d=", e)
f := do(sub, c, d)
fmt.Println("c-d=", f)
g := do(nul, c, d)
fmt.Println("c*d=", g)
}

10. 接口的使用说明。

接口是一种抽象类型,接口实现时要注意值与指针接收者的问题。

在go语言中,一个类型(主要是struct)可以实现多个不同的接口,接口之间互不影响;也可以多个类型实现同一个接口,即间接实现面向对象的开发方式。go里面的接口不需要类型(对象)完全实现所有函数方法,接口可以通过在类型中嵌入其它类型来实现。还可以通过接口不断嵌套创造出新的接口。

注意:go语言中有空接口概念(interface{}),即没有定义任何函数方法的接口,因此任何类型都实现了空接口,空接口类型的变量也就可以接收任意类型的变量(类似其它面向对象语言中的Object对象),用途非常广但需要断言正确,否则实现出现未知错误。

11. goroutine 并发使用。

并发是指同一时间段内执行的多个任务。并行是指同一时刻执行多个任务。goroutine是go语言中并发的实现,它类似于线程,但是属于用户态的线程,由go语言运行时调度完成,不同于线程由操作系统调度完成。

 ...
go func(){
//并发执行函数逻辑
}()
...

常用sync.Wait.WaitGroup来解决多个并发中安全问题

12. 多个并发goroutine之前的通信channel应用。

chan类型也和map、slice(切片)类型一样,用make创建。

-end-

Go语言学习总结的更多相关文章

  1. C语言学习 第八次作业总结

    本次作业其实没有新的内容,主要就是复习上一次的一维数组的相关内容.冯老师布置了5道题目,其中涉及到一些比较简单的排序或者是查找的方法.因为数据很少,所以直接使用for循环遍历就可以了. 关于本次作业, ...

  2. C语言学习 第七次作业总结

    C语言学习 第七次作业总结 数组可以分为数组和多下标数组(在传统的国内C语言书本中,将其称为二/多维数组). 数组名称 在之前的课程中,大家应该都有印象,对于int a这样的定义,会为变量 a 声明一 ...

  3. 技能收获与C语言学习

    你有什么技能比大多人(超过90%以上)更好? 我会的东西很多,喜欢的东西太多,但是很遗憾广而不专,会而不精.学了很多东西我都是为了娱乐,因为以前我们那里过于强调学习,很多爱好也都被扼杀在摇篮里.我觉得 ...

  4. 一份关于Swift语言学习资源的整理文件

    一份关于Swift语言学习资源的整理文件     周银辉 在这里下载 https://github.com/ipader/SwiftGuide

  5. go语言学习笔记

    Go语言学习基本类型Bool 取值范围:true,false (不可以用数字代替)Int/uint 根据平台可能为32或64位int8/uint8 长度:1字节 取值范围-128~127/0~255b ...

  6. 20155206赵飞技能获取经验,C语言学习感想与对JAVA的学习目标

    自己较强的技能获取经验. 1:实话实说我自己是没有哪个技能可以超过90%的人的,只有自认为做的还可以的一些事情,例如打篮球,office软件的应用,一百米跑.至于其他方面就是很平庸了. 2:经验主要有 ...

  7. HTML语言学习笔记(会更新)

    # HTML语言学习笔记(会更新) 一个html文件是由一系列的元素和标签组成的. 标签: 1.<html></html> 表示该文件为超文本标记语言(HTML)编写的.成对出 ...

  8. 20155229-付钰涵-分析自我技能延展到c语言学习状况

    我的小技能 我记得幼儿园时表演的舞蹈,也记得从水彩到素描的学习,还记得小学和初中获得的钢琴省级奖项. 舞蹈止于一年级,绘画止于三年级,钢琴从学前班到高一那十年的时间里有过断续. 03年-04年的那个冬 ...

  9. linux 下C语言学习路线

    UNIX/Linux下C语言的学习路线.一.工具篇“公欲善其事,必先利其器”.编程是一门实践性很强的工作,在你以后的学习或工作中,你将常常会与以下工具打交道, 下面列出学习C语言编程常常用到的软件和工 ...

  10. [go语言学习指南]

    内部分享,根据自己的经验,收集汇总的go语言学习指南. 适合新手入门. 可以通过这里进行下载.

随机推荐

  1. R语言文本数据挖掘(三)

    文本分词,就是对文本进行合理的分割,从而可以比较快捷地获取关键信息.例如,电商平台要想了解更多消费者的心声,就需要对消费者的文本评论数据进行内在信息的数据挖掘分析,而文本分词是文本挖掘的重要步骤.R语 ...

  2. Centos8发布,下载链接

    就在昨天Centos8发布了,今天试着尝鲜,感受:真香. 瞧官网都没有介绍,真香就是了. Centos 8 下载地址:http://ftp.sjtu.edu.cn/centos/8.0.1905/is ...

  3. flask目录结构及博客项目实战地址

    [Flask] 项目结构说明   项目结构 Flask的一大优势就是其极其轻量化.但是也需要注意到,如果我们要用Flask做一个大项目的话,把所有代码写在一个文件里肯定是不合适的.非常难以维护.但是和 ...

  4. 自用纯C语言实现任务调度(可用于STM32、C51等单片机)

    前言   这个任务调度模块的实现是形成于毕设项目中的,用在STM32中,断断续续跨度2个月实现了一些基本功能,可能后面再做其他项目时会一点点完善起来,也会多学习相关知识来强化模块的实用性和高效性,毕竟 ...

  5. py文件转换为so文件

    将py文件编译为so文件 利用上面代码生成so文件生成的文件不方便取放,名字也不一样 通过执行发现转换执行了下面三句 /usr/local/python3/bin/cython test.py gcc ...

  6. msp430点灯实验

    title: msp430点灯实验 date: 2023-04-15 15:31:25 description: 基于msp430f5529点灯实验 一.实验内容 使用开发板:msp430f5529 ...

  7. 深谈Spring如何解决Bean的循环依赖

    1. 什么是循环依赖 Java循环依赖指的是两个或多个类之间的相互依赖,形成了一个循环的依赖关系,这会导致程序编译失败或运行时出现异常.下面小岳就带大家来详细分析下Java循环依赖. 简单来讲就是:假 ...

  8. 关于Java中代码的执行顺序

    结论 注意 只有显式的加载类 JVM才会加载到内存中 先加载父类的静态代码块 然后执行子类静态代码块 当前类存在类静态变量注意引用类型没进行赋值操作初始化为null 并不会显式的加载类又存在静态代码块 ...

  9. 高性能、快响应!火山引擎 ByteHouse 物化视图功能及入门介绍

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 物化视图是指将视图的计算结果存储在数据库中的一种技术.当用户执行查询时,数据库会直接从已经预计算好的结果中获取数据 ...

  10. vmware-ubuntu 设置共享目录

    VMware可以通过右上方菜单,管理-虚拟机设置,进入共享文件夹设置界面: vmware设置共享目录,重新启动windows,偶尔会失效.可以按下面步骤重新设置下,copy就行 查询是否存在已挂载的文 ...