
golang基础小记
记录golang的基础知识
萌新无罪
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
golang基础小记(24)——reflect.DeepEqual函数:判断两个值是否一致
对于array、slice、map、struct等类型,想要比较两个值是否相等,不能使用==,处理起来十分麻烦,在对效率没有太大要求的情况下,reflect包中的DeepEqual函数完美的解决了比较问题。函数签名:func DeepEqual(a1, a2 interface{}) bool文档中对该函数的说明:DeepEqual函数用来判断两个值是否深度一致:除了类型相同;在可以时(主要是基本类型)会使用==;但还会比较array、slice的成员,map的键值对,结构体字段进行深入比对。ma原创 2020-08-28 18:30:46 · 12174 阅读 · 0 评论 -
golang基础小记(23)——并发之channel、select多路复用
channel原创 2020-08-19 17:08:09 · 967 阅读 · 0 评论 -
golang基础小记(22)——并发之goroutine:使用方式、sync.WaitGroup
goroutineGo语言的并发通过goroutine实现,其概念类似于线程,属于用户态的线程,我们可以创建无数个goroutine并发工作。goroutine是由Go的运行时(runtime)来调度和管理的。使用方式启动goroutine只需要在调用的函数前加上go关键字,函数可以是普通函数也可以是匿名函数。在程序启动时,Go程序会为main()函数创建一个默认的goroutine。它会在main()函数返回的时候结束,此时所有在main()函数中启动的goroutine不管有没有运行完都会一同结原创 2020-08-17 17:30:54 · 343 阅读 · 0 评论 -
golang基础小记(21)——反射
反射是指在程序运行期间对程序本身进行访问和修改的能力。反射的应用:当我们用空接口接收不同类型的结构体时,很难用类型断言去判断类型(因为自定义类型可以随意取名),这时就可以用到反射,来来得到结构体的类型,并进一步得到字段和对应值。注意:反射引起的panic在编译时不会产生,只有在运行时才能发现,所以代码比较脆弱应用反射的代码通常难以理解反射的性能更低所以在写代码时要尽量避免使用反射,除非只能使用反射!(这也是我不想写细致内容的借口。。。以后用到再说。。。)reflect包提供反射相关功能。原创 2020-08-14 12:21:14 · 380 阅读 · 0 评论 -
golang基础小记(20)——将格式化字符串作为函数参数
直接上简单实例:package mainimport "fmt"func formatAsArgs(format string, a ...interface{}) { s := fmt.Sprintf(format, a...) fmt.Println(s)}func main() { name := "小明" id := 10086 formatAsArgs("name:%s, id:%d", name, id) // name:小明, id:10086 formatAsAr原创 2020-08-10 17:22:01 · 528 阅读 · 0 评论 -
golang基础小记(19)——runtime.Caller简单使用:获取函数名和对应的文件名、行号
runtime.Caller函数签名:func Caller(skip int) (pc uintptr, file string, line int, ok bool)Caller报告当前go程调用栈所执行的函数的文件和行号信息。实参skip为上溯的栈帧数,0表示Caller的调用者(Caller所在的调用栈)。函数的返回值为调用栈标识符、带路径的完整文件名、该调用在文件中的行号。如果无法获得信息,ok会被设为false。根据pc获取函数名根据返回的调用栈标识符pc,我们可以获取对应的函数名。原创 2020-08-10 15:45:16 · 3428 阅读 · 0 评论 -
golang基础小记(18)——文件操作:文件开关、简单的读写实例、设置文件读写位置、文件删除、文件名重命名、文件操作相关方法/函数补充
文件打开和关闭os包中Open()函数能够以只读方式打开一个文件,函数返回*File和err。打开的文件可以通过调用Close()方法关闭。Open()函数定义:func Open(name string) (*File, error)Open()函数接收文件路径,返回一个文件指针和可能的具体错误。Close()方法定义:func (file *File) Close() error示例:import ( "fmt" "os")func main() { file, err原创 2020-08-07 13:00:33 · 426 阅读 · 0 评论 -
golang基础小记(17)——包(package):自定义包、标识符可见性、导入、init()函数、简单实例
定义包一个包可以简单理解为一个存放.go文件的文件夹。这些go文件都归属于该包,通过在代码第一行声明实现。声明格式:package 包名注意:一个包下面的所有文件只能归属于同一个包。包名可以和文件夹名不同,包名不能包含-符号。main包是应用程序的入口包,只有main包才会在编译后生成可执行文件。包中标识符的对外可见性标识符包括变量、常量、类型、函数等,还有结构体中的字段名、接口中的方法名,Go语言中只要将标识符的首字母大写,就可以让该标识符对外可见。导入包使用import关键字导原创 2020-08-06 14:00:41 · 449 阅读 · 0 评论 -
golang基础小记(16)——接口(interface):基本概念、接口嵌套、空接口、类型断言(获取接口底层值)
基本概念定义Go语言中接口(interface)是一种类型,一种抽象的类型。接口类型是由一组方法签名定义的集合。接口的定义格式:type 接口类型名 interface{ 方法名1( 参数列表1 ) 返回值列表1 方法名2( 参数列表2 ) 返回值列表2 …}接口类型名:自定义,一般会在后面添加er,表明接口类型方法名首字母和接口类型名首字母都大写时,该方法可以被其他包访问参数列表和返回值列表中可以省略变量名,只保留类型名实现接口其它类型只要实现了一个接口的原创 2020-08-04 21:22:01 · 497 阅读 · 1 评论 -
golang基础小记(15)——方法(Method)
方法方法(Method)就是一类带特殊的接收者(Receiver)参数的函数。其与函数的区别在于,函数不属于任何类型,方法属于特定的类型。定义格式:func (接收者变量 接收者类型) 方法名(参数) 返回值 { 函数体}示例:type myInt int// 给myInt类型添加方法,判断值是否大于5func (i myInt) biggerThanFive() bool { if i > 5 { return true } return false}func原创 2020-07-30 17:27:01 · 249 阅读 · 0 评论 -
golang基础小记(14)——结构体:定义、初始化、构造函数、匿名字段、嵌套结构体、JSON序列化与反序列化
结构体定义Go语言没有类的概念,但是可以通过结构体实现面向对象编程。结构体是一种自定义数据类型,其可以封装任何类型。示例:type house struct { size, price float64 style string}上例house是自定义结构体类型,包括size、price、style三个字段,可以用来描述房子的面积、价格和风格。house类型的变量可以很方便的存储房子信息。结构体实例化结构体是值类型,需要声明后才能使用,声明后内部成员的值默认是对应成员类型的零值。基本实原创 2020-07-29 20:13:11 · 5375 阅读 · 0 评论 -
golang基础小记(13)——自定义类型和类型别名(type)
自定义类型Go语言通过type关键字定义自定义类型。自定义类型是全新的类型。示例:// 将newInt定义为int类型type newInt intfunc main() { var a newInt a = 100 fmt.Println(a) // 100 fmt.Printf("%T\n", a) // main.newInt}上例中的newInt是具有int特性的新类型。可以看到变量a的类型是main.newInt,这表示main包下定义的newInt类型。原创 2020-07-29 09:49:04 · 727 阅读 · 0 评论 -
golang基础小记(12)——defer
defer语句Go语言中的defer语句会将其后面跟随的函数推迟到外层函数返回之后执行。推迟调用的函数其参数会立即求值,但直到外层函数返回前该函数都不会被调用。推迟的函数调用会被压入一个栈中,当外层函数返回时,被推迟的函数会按照后进先出的顺序调用。defer语句后面只能跟函数调用。示例:a := 1b := 2defer fmt.Println(1, a + b) // 推迟的函数参数会立即赋值,后续改变参数值不会影响结果defer func() { // 该函数没有参数,如果函数内部使用了外原创 2020-07-26 16:18:12 · 246 阅读 · 0 评论 -
golang基础小记(11)——函数基础、高阶函数、匿名函数、闭包、内置函数简介
函数基础语法格式:func 函数名(参数)(返回值) { 函数体}参数参数由参数变量和对应类型组成,多个参数用,分隔。Go语言中函数没有默认参数类型简写:当连续两个或多个函数的参数类型相同时,除最后一个类型以外,其它都可以省略。比如参数x int, y int可以写成x, y int。可变参数:当参数数量不固定时,可以通过在参数名后加...来标识可变参数。可变参数在函数中通过切片来实现。可变参数必须放在固定参数的后面。示例如下:func sum2(x ...int) int {原创 2020-07-25 16:30:07 · 194 阅读 · 0 评论 -
golang基础小记(10)——map
map基本概念语法:map[keyType]valueType用于存储键值对(key-value),键具有唯一性内部的键值对之间是无序的,和存入的顺序无关引用类型,声明后值为nil,此时无法添加键值对,需要先使用make()来分配内存(使用方式见基础小记(9))获取长度,即键值对个数:len(map)切片的元素类型可以是map,如[]map[string]string。此时要注意每个元素都需要用make()初始化map的值可以是切片,如map[string][]string添加键值对原创 2020-07-25 12:07:35 · 268 阅读 · 0 评论 -
golang基础小记(9)——指针、new和make
指针Go语言中的指针不能进行偏移和运算,没有内存泄漏的风险。&:取地址操作符,取出变量的地址*:取值操作符,取出指针指向的值b := &a:原创 2020-07-24 21:38:37 · 611 阅读 · 0 评论 -
golang基础小记(8)——切片:make()函数构造、append()添加元素、copy()复制切片、删除元素
make()函数构造make()函数能动态的构造切片,控制新切片的长度和容量,格式如下:s := make([]T, len, cap)原创 2020-07-23 19:52:19 · 3530 阅读 · 0 评论 -
golang基础小记(7)——切片:初始化、基础概念
切片(slice)切片(Slice)是一个拥有相同类型元素的可变长度的序列。切片是引用类型,本身并不存储任何数据,其内部包括地址、长度、容量,其底层是数组,所以地址指向底层数组的对应元素。另外,长度是切片的元素个数,容量是长度的最大值,超过则需要扩容。切片长度和容量可以通过内置的len()函数和cap()函数获得。var s = []int{1, 2, 3}fmt.Println("长度:", len(s), "容量:", cap(s)) // 长度: 3 容量: 3初始化直接声明直接声明得原创 2020-06-21 11:18:02 · 3774 阅读 · 0 评论 -
golang基础小记(6)——数组:定义、初始化、遍历
Array数组定义数组是同一种数据类型元素的集合。 在Go语言中,数组声明时必须指定元素类型和长度。使用时只可以修改元素值,不可修改长度。不同长度或元素类型的数组属于不同的类型。var a1 [3]bool // 定义了元素类型是bool,长度为3的数组var a2 [4]bool// 输出数组类型,可见数组类型由元素类型和长度共同决定fmt.Printf("%T %T", a1, a2) // [3]bool [4]bool一维数组初始化直接声明可以将元素默认初始化为对应类型的零值。原创 2020-06-16 16:07:57 · 801 阅读 · 0 评论 -
golang基础小记(5)——最基本的go命令
最基本的go命令go build:编译go程序go build -o "xx.exe":编译成 xx.exe 文件,双引号可加可不加go run main.go:像执行脚本一样执行main.go文件,本质是先编译,然后直接执行,但不保留可执行文件go install:编译并将可执行文件拷贝到GOPATH/bin下...原创 2020-06-14 23:22:29 · 211 阅读 · 0 评论 -
golang基础小记(4)——if、for、for range、switch
if、for、for range、switch内容均以代码形式呈现,包括:if,注意表达式不需要加();左大括号{必须与if、else在同一行;大括号{}绝对不能省去。(示例代码第6行)for,go中没有while。(示例代码第26行)for range,遍历数组、切片、字符串时返回索引(int类型)和值;map 返回键和值;通道(channel)只返回通道内的值;如果不想要返回的值,用_代替(示例代码第59行)switch(示例代码第85行)示例代码:package mainimpo原创 2020-06-04 18:01:45 · 393 阅读 · 0 评论 -
golang基础小记(3)——字符类型(byte和rune)与字符串修改
byte和rune类型两种字符类型:uint8类型,或者叫 byte 型,代表了ASCII码的一个字符。rune类型,代表一个UTF-8字符,本质是int32类型。rune类型用于处理复合字符,如中文、日文等。代码示例:package mainimport "fmt"func main() { s := "wo ai 中国" // len(s)返回的是s的字节数,而不是字符数 fmt.Println(len(s)) // 12 // 用len(s)逐个打印,实际是按字节输出,原创 2020-06-03 16:28:01 · 676 阅读 · 0 评论 -
golang基础小记(1)——fmt.Printf()的一些输出格式
fmt.Printf()的一些输出格式示例代码:package mainimport "fmt"func main() {var n = 100fmt.Printf("%T\n", n) // 类型fmt.Printf("%v\n", n) // 值fmt.Printf("%b\n", n) // 二进制fmt.Printf("%d\n", n) // 十进制fmt.Printf("%o\n", n) // 八进制fmt.Printf("%x\n", n) // 十六进原创 2020-06-02 21:17:50 · 734 阅读 · 0 评论 -
golang基础小记(2)——字符串常用操作、常用函数补充
字符串常用操作代码示例:package mainimport ( "fmt" "strings")// 转义符// \r: 回车符,返回行首,后续字符串会从行首覆盖该行字符串// \n: 换行符// \t: 制表符func main() { // 一对双引号内部的双引号需要转义才能使用;路径中的反斜杠需要转义才能正确输出 fmt.Println("str := \"c:\\Code\\lesson1\\go.exe\"") // str := "c:\Code\lesson1原创 2020-06-02 21:54:21 · 455 阅读 · 0 评论