
go语言
文章平均质量分 53
go
fanfjaiynu
汪
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
go语言—文件操作
计算机中的文件是存储在外部介质(通常为磁盘)上的数据集合,文件分为文本文件和二进制文件。原创 2023-06-16 15:10:04 · 613 阅读 · 0 评论 -
go语言—并发安全和锁
在某些场景下我们需要确保某些操作即使在高并发的场景下也只会被执行一次,例如只加载一次配置文件等,sync包中提供了一个针对只执行一次场景的解决方案——sync.Once。互斥锁是完全互斥的,但很多场景是读多写少,但并发的去读取资源且不涉及修改时是没必要加锁的。Go 语言中内置的 map 不是并发安全的,我们不能在多个 goroutine 中并发对内置的 map 进行读写操作,否则会存在数据竞争问题。需要注意的是读写锁非常适合读多写少的场景,如果读和写的操作差别不大,读写锁的优势就发挥不出来。原创 2023-06-14 19:17:54 · 295 阅读 · 0 评论 -
go语言—select多路复用
某些场景下需要从多个通道中同时接收数据,go语言内置select关键字,支持同时操作多个通道。原创 2023-06-14 17:39:44 · 220 阅读 · 0 评论 -
go语言—channel通道
channel 是Go语言在语言级别提供的 goroutine 间的通信方式。通常会选择用for range循环从通道中接收值,当通道被关闭后,会在通道内的所有值被接收完毕后会自动退出循环。通道共有发送(send)、接收(receive)和关闭(close)三种操作。而发送和接收操作都使用<-符号。目前判断通道是否关闭只能通过对通道的读取操作景象判断,不能简单的通过len(ch)操作来判断通道是否被关闭。在函数传参及赋值操作中的普通通道都能转换为单向通道。限制通道在某个函数中只能执行发送值或接收值操作。原创 2023-06-14 17:15:27 · 313 阅读 · 0 评论 -
go语言—goroutine并发
因为在go程序启动时,go程序就会为main函数创建一个默认的 goroutine ,所以上述代码中存在两个并发执行的goroutine,当 main 函数结束时整个程序也就结束了,所有由 main goroutine 创建的 goroutine 也会一同退出。:线程是系统能够调度的最小单位,被包含在进程里,是进程中的实际运作单位,一个进程可以包含多个进程。因为在程序中创建 goroutine 执行函数需要一定的开销,而与此同时 main 函数有默认的goroutine,不需要另外创建,可以直接执行的。原创 2023-06-14 14:18:13 · 141 阅读 · 0 评论 -
go语言—接口
接口就是一系列方法的集合,但是还没有实现,需要对象自己去实现type 接口类型名 interface {原创 2023-06-13 17:29:11 · 1225 阅读 · 0 评论 -
go语言—gopath转go module
go语言早期版本中,写Go项目代码时所依赖的所有第三方包都需要保存在GOPATH这个目录下面,这样的依赖管理方式存在一个致命的缺陷,那就是不支持版本管理,同一个依赖包只能存在一个版本的代码也用来存放Go源码,Go的可运行文件,以及相应的编译之后的包文件,所以GOPATH这个目录下面有三个子目录:src、bin、pkg,这三个目录的作用是:src 存放你项目的源码 (xxx.go)pkg 存放编译后生成的文件 (xxx.a)bin 存放编译后生成的可执行文件。原创 2023-06-11 17:54:23 · 390 阅读 · 0 评论 -
go语言—包的定义
可以根据自己的需要创建自定义包。一个包可以简单理解为一个存放.go文件的文件夹。原创 2023-06-11 15:51:16 · 396 阅读 · 0 评论 -
go语言—结构体其它
嵌套结构体内部可能存在相同的字段名,为了避免歧义需要通过指定具体的内嵌结构体字段名。Json格式进行序列化及对象关系映射系统都会用到结构体标签,通过反射机制读取出来。结构体允许成员字段在声明时没有字段而只有类型,被称为匿名字段。一个结构体中可以嵌套包含另一个结构体或结构体指针。结构体中字段大些开头表示可公开访问,小写表示私有。原创 2023-06-11 13:50:50 · 81 阅读 · 0 评论 -
go语言—方法和接收器
当方法为值类型接收器时,go会在代码运行时将接收器的值复制一份,所以修改在值类型接收器中获取成员后修改值,只是修改了副本,无法修改接收器变量本身。原创 2023-06-10 22:16:49 · 464 阅读 · 0 评论 -
go语言—构造函数
go的结构体没有构造函数,可以自己实现。原创 2023-06-10 21:13:52 · 173 阅读 · 0 评论 -
go语言—结构体
有时单一的基本数据类型无法表示一个事物的全部或部分属性,go语言就提供了一种自定义数据类型,可以封装多个基本数据类型,这种自定义的数据类型叫结构体(struct),go语言通过结构体来实现面向对象1.1、结构体的定义使用type和struct关键字定义结构体tyep 类型名 struct {字段名 字段类型字段名 字段类型 ... } 类型名 : 自定义结构体的名称,在同一个包内不能重复 struct {原创 2023-06-10 20:42:46 · 256 阅读 · 0 评论 -
go语言—map
KeyType:表示键的类型ValueType:表示键对应的值的类型。原创 2023-06-06 15:16:50 · 75 阅读 · 0 评论 -
go语言—new和make
以上代码引发panic的原因是:var a *int 只是声明了一个指针变量a,但并没有进行初始化。指针是引用类型,需要初始化后才能分配内存空间,才能给它赋值。也用于分配内存,但只用于slice、map和channel的内存创建,返回的类型就是三个类型本身,因为这三种类型本来就是引用类型,没必要返回他们的指针了。原创 2023-06-10 16:49:04 · 79 阅读 · 0 评论 -
go语言—指针
例如:将“Hello go”这句话写入程序,将值赋给变量A,将内存地址赋给变量B,那么B就是一个指针变量,A是string类型变量,通过A和B都能找到“Hello go”原创 2023-06-10 15:44:00 · 85 阅读 · 0 评论 -
go语言—defer语句
当defer放在return后面时就不会被执行。原创 2023-06-08 22:10:09 · 102 阅读 · 0 评论 -
go语言—闭包
【代码】go语言—闭包。原创 2023-06-07 22:19:47 · 86 阅读 · 0 评论 -
go语言—匿名函数
func(参数)(返回值) {函数体 }原创 2023-06-07 17:55:10 · 170 阅读 · 0 评论 -
go语言—函数进阶
可以使用type关键字来定义函数类型。原创 2023-06-07 17:31:21 · 65 阅读 · 0 评论 -
go语言—普通函数
func 函数名(参数)(返回值){函数体函数:由字母、数字、下划线组成,在同一个包内函数名不能重名参数:局部变量,值由函数调用者提供,多个参数用逗号隔开返回值由返回值变量和变量类型组成,也可以只写返回值类型,多个返回值必须用括号包裹并使用逗号分隔,如果没有返回值括号可以省略3和2是调用时传入的实数,函数返回一个int类型的值,返回值也可以被命名如果一个函数包含返回值,那么函数必须以return语句结尾,除非函数明显无法运行到结尾处。原创 2023-06-07 15:38:18 · 91 阅读 · 0 评论 -
go语言—控制流程
第 14 行,默认情况下循环只能一层一层退出,为此就需要设置一个状态变量 breakAgain,需要退出时,设置这个变量为 true。第 15 行,标签只能被 goto 使用,但不影响代码执行流程,此处如果不手动返回,在不满足条件时,也会执行第 18 行代码。代码说明:第 12 行将结束当前循环,开启下一次的外层循环,而不是第 8 行的循环。第 16 行,使用 break 退出当前循环,执行后,代码调转到第 20 行。第 10 行,使用 goto 语句跳转到指明的标签处,标签在第 17 行定义。原创 2023-06-07 13:53:16 · 111 阅读 · 0 评论 -
go语言—切片的其它操作
要判断一个切片是否为空,应该用len(s) == 0来判断,而不是 s == nil来判断。两个切片共享底层数组,所以对一个切片的修改会影响另一个切片的内容。切片遍历和数组是一致的,支持索引遍历和for range遍历。把一个切片复制到另一个切片上。两个切片不一样长时的复制。原创 2023-06-05 21:21:28 · 270 阅读 · 0 评论 -
go语言—切片的定义
var a [ ] string // 定义一个空切片,[]中不带任何内容就是切片 var b = [ ] int {} //声明一个整数切片并初始化 var c = [ ] bool {"false" , "true" } //声明一个布尔切片并初始化 // 切片是引用类型,不支持直接比较,只能和nil比较 fmt . Println(a == nil) //true fmt . Println(b == nil) //false fmt . Println(c == nil) //false。原创 2023-06-05 18:12:08 · 391 阅读 · 0 评论 -
go语言—数组
var 数组变量名 [n]Tn表示数组中元素数量T代表元素类型一旦定义,数组大小就固定了且不能改变// 数组的定义方式 var a [ 3 ] int //只定义没有赋值,数组会初始化为int类型的零值即0,[3]int是该数组的数据类型 fmt . Println(a) // [0 0 0] 字符串类型数组初始化值为“”布尔类型数组初始化值为 false 数字类型数组初始化值为 0 切片和 map 初始化值为 nil。原创 2023-06-05 15:24:25 · 109 阅读 · 0 评论 -
go语言—字符串与其它类型转换(strconv包)
Parse类函数用于转换字符串为给定类型的值:ParseBool()、ParseFloat()、ParseInt()、ParseUint()Append类的函数和Format类的函数工作方式类似,只不过将转换后的结果追加到一个slice中。返回字符串s是否可以不被修改的表示为一个单行的、没有空格和tab之外控制字符的反引号字符串。返回一个字符是否是可打印的,r必须是:字母(广义)、数字、标点、符号、ASCII空格。返回字符串表示的整数值,接受正负号。用于将布尔类型的值转换为字符串类型。原创 2023-06-04 19:33:59 · 1084 阅读 · 0 评论 -
go语言—字符串处理(strings包)
strings.Fields(str) 会利用一个或多个空白符号作为分隔符将字符串分割成若干小块,并返回一个slice,如果字符串只包含空白符号,则返回一个长度为0的slice。Replace()用于将字符串中的前n个字符串old 替换为字符串 new,并返回一个新字符串,如果 n = -1 则替换所有字符串 old 为字符串 new。Index()返回字符串或字符xxx在字符串中的索引(字符第一次出现的索引位置),-1表示不包含字符串。Repeat()用于重复count次字符串s并返回一个新的字符串。原创 2023-06-03 21:27:19 · 387 阅读 · 0 评论 -
go语言—基本数据类型(byte和rune类型)
2、字符串不能修改,字符串是由byte字节组成,所以字符串长度是byte字节长度。3、rune类型用来表示utf8字符,一个rune字符由一个或多个byte组成。1、字符串底层是byte数组,所以可以和[]byte类型相互转换。原创 2023-06-03 16:13:45 · 270 阅读 · 0 评论 -
go语言—基本数据类型(字符串)
【代码】go语言—基本数据类型(字符串)原创 2023-06-03 14:51:30 · 132 阅读 · 0 评论 -
go语言—基本数据类型(整型、浮点型、布尔型)
Go语言提供了两种精度的复数类型:complex64和complex128,分别对应float32和float64两种浮点数精度。这些浮点数类型的取值范围可以从很微小到很巨大。Go1.13版本以后引入了数字字面量语法,便于以二进制、八进制、十六进制浮点数的格式定义数字。复数是由两个浮点数表示的,其中一个表示实部(real),一个表示虚部(imag)Go语言提供两种精度的浮点数:float32和float64。2、布尔型无法参与数值运算,也无法与其它类型进行转换。3、go语言不允许将整型强转为布尔型。原创 2023-06-02 13:53:27 · 91 阅读 · 0 评论 -
go语言—常量
【代码】go语言—常量。原创 2023-05-30 15:39:41 · 73 阅读 · 0 评论 -
go语言—变量
go语言声明变量时会自动对变量对应的内存区域进行初始化操作,每个变量被初始化成其类型的默认值。go语言的变量需要声明后才能使用,并且变量声明后必须使用。切片、函数、指针变量默认为nil。整型和浮点型变量默认值为0。字符串变量默认值为空字符串。布尔型变量默认为false。原创 2023-05-30 14:46:33 · 64 阅读 · 0 评论