首页 > 其他分享 >Go语言学习总结

Go语言学习总结

时间:2023-06-17 19:33:24浏览次数:38  
标签:总结 defer 语言 int fmt Println func sl Go

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-

标签:总结,defer,语言,int,fmt,Println,func,sl,Go
From: https://www.cnblogs.com/daizhongkai/p/17488109.html

相关文章

  • 使用go标准库发送邮件
    在学习go语言的过程中,发现smtp邮件服务也在go语言的标准库中支持,所以写了一个小demo测试是否能够真的发送邮件,代码如下:packagemainimport( "crypto/tls" "log" "net/smtp")const( smtpServer="smtp.163.com"//smtp服务器地址 account="xxxxxxxxxx"......
  • opcenter camstar designer基础知识-- Categories
    “类别”窗口用于定义新的“Storage”和“table”类别。类别如下  左窗格包含选择树,其中列出所有可用的类别。右键单击此选择窗格,将打开具有以下选项的快捷菜单: • addcategoriesdefinition添加类别定义• removecategoriesdefinition 移除类别定义下表定......
  • C语言-数据存储详解
     C语言类型内置类型整型家族char//字符数据类型1个字节unsignedcharsignedcharshort//短整型4个字节unsignedshort[int]signedshort[int]int//整型4个字节 unsignedint  signedint long//长整型8个字节unsignedlong[int] signedlong[int]longlong//更长......
  • alfred 配合 picgo 图床 上传图片
    alfred配合picgo图床上传图片需要实现的功能是:alfred快捷键通过picgo直接上传剪切板中的图片前提:安装pngpastebrewinstallpngpastejq1.开启picgohttp上传2.创建alfredworkflow工作流一个scriptfilter将结果处理后传递到粘贴板中核心逻辑mkdir-p......
  • C语言基础教学(文件操作)
    (文章目录)前言这篇文章我们来讲解C语言中的文件操作,文件操作在C语言中算是一个比较重要的知识点,我们每天都在和文件打交道,各种文件夹的打开和关闭操作,那么这篇文件带大家学习如何使用C语言中的文件操作来完成这个工作。一、文件操作基本介绍C语言提供了一组函数,可以用于进行......
  • es-analysis模块学习总结
    什么是Analysis顾名思义,文本分析就是把全文本转换成一系列单词(term/token)的过程,也叫分词。在ES中,Analysis是通过分词器(Analyzer)来实现的,可使用ES内置的分析器或者按需定制化分析器。举一个分词简单的例子:比如你输入MasteringElasticsearch,会自动帮你分成两个单词,一个是......
  • [Go] 理解 Go 的 unintptr、unsafe.Pointer、*type
    理解Go的unintptr、unsafe.Pointer、*type概念*type:用于传递对象地址,无法进行指针运算unsafe.Pointer:通用指针,用于表示任意类型的指针,无法进行指针运算,无法读取存储的值,可作为对象引用任意类型的指针可以转换为unsafe.Pointerunsafe.Pointer可以转换为任......
  • Django学习笔记
    1.常用命令创建项目:django-adminstartproject项目名创建APP(进入工程目录):pythonmanage.pystartapp网站名创建库表(进入工程目录):pythonmanage.pymakemigrations执行库表建立(进入工程目录):pythonmanage.pymigrate启动运动:pythonmanage.pyrunserver模板渲染嵌入......
  • MongoDB入门操作
    数据库操作查看所有数据库--->showdbs通过use关键字切换数据库--->usetestdb删除数据库--->db.dropDatabase()新增数据db.COLLECTION_NAME.insert(document)注意事项:在MongoDB中,存储的文档结构是一种类似于json的结构,称之为bson(全称为:BinaryJSON)如:{id:2,userna......
  • Go设计模式实战--用状态模式实现系统工作流和状态机
    大家好,这里是每周都在陪你进步的网管~!本节我们讲一个行为型的设计模式--状态模式,并通过Golang示例进行实战演示。状态模式(StatePattern)也叫作状态机模式(StateMachinePattern)状态模式允许对象的内部状态发生改变时,改变它的行为,就好像对象看起来修改了它实例化的类,状态模式是一种......