![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
goland
文章平均质量分 57
goland学习
gzlp
这个作者很懒,什么都没留下…
展开
-
go struct 的常见问题
秋招来了,你做好准备面试了吗?面试官会问go struct哪些问题呢,赶紧进来看看吧原创 2023-08-10 20:00:41 · 535 阅读 · 0 评论 -
go 函数
在Go中,函数是一种基本的代码块,用于执行特定的任务。函数在Go中被定义为一个代码块,具有名称和一些参数,可以接受并返回值。// 函数体 return value }其中,func是关键字,是函数的名称,是参数的名称,type是参数的数据类型,是函数的返回类型,value是函数返回的值。在Go中,return语句用于从函数中返回值并停止函数执行,并把代码的执行权返回给调用者。对于无返回值的函数,函数体末尾的return语句可以直接省略。return。原创 2023-08-08 14:42:13 · 466 阅读 · 0 评论 -
append()函数
go 内置函数 append()说明原创 2023-08-06 22:27:52 · 861 阅读 · 0 评论 -
Go 内置函数 close()
go 语言内置函数 close() 关闭channel 以及 关闭channel过程中发生了什么事情原创 2023-08-06 21:50:55 · 735 阅读 · 0 评论 -
go 内置函数copy()
go 语言内置函数copy()说明,copy后是否共享内存,dst slice 长度小于 src slice 长度会发生什么事原创 2023-08-06 21:05:43 · 1915 阅读 · 0 评论 -
go nil 与零值
go 语言的 nil 与 零值的关系原创 2023-07-31 23:15:49 · 476 阅读 · 0 评论 -
Go new 与 make
goland 中 new 和 make 有什么区别原创 2023-07-31 22:53:41 · 453 阅读 · 0 评论 -
len()函数原理
简单说说内置函数len()原创 2023-07-31 22:32:32 · 403 阅读 · 0 评论 -
Go 可比较类型
goland中类型分为可比较类型和不可比较类型,它们是怎么区分的呢原创 2023-07-24 11:09:46 · 558 阅读 · 0 评论 -
Go 语言 值类型和引用类型
引用类型的变量存储的是数据在内存中的地址,它们在栈上仅仅存储地址,而真正的数据存储在堆上。当把一个引用类型的变量赋值给另外一个变量、作为函数参数传递或者从函数返回时,只会赋值地址,而不是复制数据本身。这使得多个变量可以引用相同的底层数据,修改其中的一个变量的值会影响其他引用该数据的变量的值。原创 2023-07-24 11:07:11 · 280 阅读 · 0 评论 -
context原理与关键代码分析
Context是 Go 语言标准库中的一个接口,定义了与请求的生命周期相关的操作和值的传递。oktruefalse<-channil通过这些方法,我们可以获取上下文的截止时间、接收上下文结束的信号、获取上下文的结束原因以及获取上下文中传递的值。Context接口的实现类型有多种,包括等。通过这些函数创建的上下文对象可以用于控制并传递请求的上下文信息,实现请求的超时控制、取消操作、值传递等功能。原创 2023-07-18 16:55:23 · 270 阅读 · 0 评论 -
context使用场景
在Go语言中有广泛的应用场景,特别是在处理并发、网络请求和超时控制等方面。原创 2023-07-18 16:54:45 · 519 阅读 · 0 评论 -
生成context
对象,用于传递请求的上下文信息、取消信号和请求特定的值。根据具体的应用场景,选择合适的生成方式以满足需求。的方式,可以根据不同的需求创建不同类型的。在Go语言中,可以使用。包提供的几种函数来生成。原创 2023-07-18 16:53:53 · 97 阅读 · 0 评论 -
select 和 switch 的异同
总结: select 和 switch 是 Go 语言中用于不同场景的语法结构。select 用于处理多个通道操作,一次只执行一个可执行的 case 子句。switch 用于根据表达式的值选择执行的分支,可以处理更多种类的条件。它们在语法和用途上有所区别,需要根据具体的需求选择合适的语法结构。select 和 switch 是 Go 语言中两种不同的语法结构,它们用于不同的场景,并且在语法和用途上存在一些区别。原创 2023-07-18 00:21:29 · 283 阅读 · 0 评论 -
switch 语句
的值为 1,则会先执行第一个 case 下的代码块(打印 “One”),然后执行第二个 case 下的代码块(打印 “Two”)。会使程序继续执行下一个 case 的代码块,不管下一个 case 的值是否匹配。的值不是 1、2 或 3,则会执行 default 下的代码块(打印 “Other”)。在这个例子中,expression 必须是一个接口类型的值,用于判断其具体类型。的值为 2 或 3,则只会执行对应的 case 下的代码块,不会执行。需要注意的是,在 Go 语言中,关键字,编译器会报错。原创 2023-07-18 00:17:40 · 182 阅读 · 0 评论 -
select 语法和 select 死锁问题
本文介绍了 Go 语言中的 select 语法以及与之相关的 select 死锁问题。我们将详细讨论 select 语句的语法,解答常见的疑问,并提供示例代码进行说明。原创 2023-07-18 00:09:04 · 297 阅读 · 0 评论 -
go工作池模板记录
当有新的任务到达时,它们会被提交到工作池,由其中的一个空闲goroutine来处理任务。通过修改和扩展上述代码,您可以根据实际项目的需求来创建一个适用的工作池。您可以调整worker的数量、定义适当的任务和结果结构,以及自定义任务处理逻辑和结果处理逻辑。Go语言中的工作池(Worker Pool)是一种常用的并发模式,它可以有效地管理和复用一组固定数量的goroutine(Go协程),以处理并发任务。在这个模板化的工作池示例中,您可以根据实际项目的需求进行修改和扩展。原创 2023-07-17 23:07:36 · 495 阅读 · 0 评论 -
sync.Map
但是,并发写入操作的性能可能会受到影响,因为在并发写入时会进行复制操作,所以如果有高度并发的写入需求,可能需要考虑其他的并发安全的数据结构。从输出可以看出,我们成功地存储了几个键值对,并且能够根据键加载对应的值。在遍历键值对时,我们可以看到被删除的键值对已经不再出现在遍历的结果中。是Go语言中的并发安全的字典类型,它可以在多个goroutine之间安全地进行并发读写操作,而无需额外的锁机制。方法遍历了映射表中的所有键值对,并打印出每个键值对的值。的键和值可以是任意类型,不限于特定的类型。原创 2023-07-16 21:30:04 · 108 阅读 · 0 评论 -
sync.Pool
获取的对象,不能假设它们会一直可用,必须在使用后进行适当的处理。此外,池中的对象在并发环境下是安全的,多个goroutine可以同时使用池中的对象,不需要额外的同步操作。并不保证池中的对象一定会被保留,具体的回收策略是实现依赖的。是Go语言中的对象池,它用于重用对象,避免频繁的创建和销毁,从而提高性能。方法从池中获取一个对象,并打印出该对象的值。时,从池中获取到了先前放回的对象。时,由于对象没有放回池中,因此会再次调用。方法获取对象,但不放回池中,下次调用。时,由于池中没有可用对象,因此调用了。原创 2023-07-16 21:29:28 · 141 阅读 · 0 评论 -
sync.Cond
它提供了等待和通知的功能,允许goroutine在特定条件下进行等待,并在条件满足时进行通知。如果缓冲区为空,则消费者等待,直到有数据可用。如果缓冲区非空,则生产者等待,直到有空间可用。在生产者和消费者的操作中,通过。在生产者-消费者模型中,生产者生产数据并将其放入缓冲区,而消费者从缓冲区中获取数据进行消费。从输出可以看出,生产者在缓冲区满时进行等待,而消费者在缓冲区空时进行等待。,我们可以实现复杂的同步和线程间通信的模式,其中包括生产者-消费者问题。进行通知,从而实现了生产者和消费者之间的同步。原创 2023-07-16 21:28:56 · 241 阅读 · 0 评论 -
sync.Once
是Go语言中的一个同步原语,它用于确保一个函数只被执行一次,即使在多个goroutine中同时调用也可以保证只执行一次。标志的值,如果已经被设置为1,则表示函数已经执行过,直接返回;的goroutine会执行函数,其他goroutine调用。标志的值为0,则表示函数尚未执行,此时会获取互斥锁。方法保证函数只被执行一次,所以只有第一个调用。标志的值,如果仍然为0,则调用传入的函数。标志已经被设置为1,函数将不会被执行。方法,函数仍然可能被执行多次。时会直接返回,不再执行函数。,用于执行函数,函数类型为。原创 2023-07-16 21:27:56 · 251 阅读 · 0 评论 -
sync.RWMutex
需要注意的是,读锁是共享的,多个goroutine可以同时持有读锁并进行读操作,读操作之间不会互斥。而写锁是排他的,同一时间只能有一个goroutine持有写锁,其他goroutine的读写操作都会被阻塞。提供了一种灵活且高效的方式来控制共享资源的并发访问。通过合理地使用读锁和写锁,我们可以提高并发性能,并保证共享资源的一致性和正确性。方法,可以实现对共享资源的排他写操作,保证同一时间只有一个goroutine可以进行写操作。是Go语言中的读写互斥锁,它提供了对共享资源的并发读写操作的支持。原创 2023-07-16 21:27:09 · 197 阅读 · 0 评论 -
sync.Mutex
是Go语言中的互斥锁,它用于在多个goroutine之间提供对共享资源的互斥访问,以确保同一时间只有一个goroutine可以访问共享资源。使用互斥锁时,需要谨慎处理竞争条件和死锁问题,确保正确地获取和释放锁,以避免数据的不一致性和程序的死锁。变量进行加1操作,但由于使用了互斥锁,每次只有一个goroutine能够获取到锁并修改。,然后启动了10个goroutine。在上面的示例中,我们创建了一个。的值,从而保证了数据的一致性。变量进行加1操作,并打印出。获取互斥锁,然后对共享的。需要注意的是,在使用。原创 2023-07-16 21:25:57 · 269 阅读 · 0 评论 -
slice 原理
例如,如果你向切片追加一个元素,而底层数组的容量不足以容纳这个元素,Go会创建一个新的更大的底层数组,并将切片的指针指向这个新的数组。此外,当切片的容量不足时,切片会自动扩容,并分配一个更大的底层数组来容纳新的元素。总结起来,Go语言中的切片是一个动态可变长度的引用,它通过底层数组来实现数据的存储和访问。切片的长度表示切片中实际存储的元素个数,而容量则表示底层数组从切片的起始位置到底层数组末尾的元素个数。它是由三个字段组成的数据结构,这些字段分别是指向底层数组的指针、切片的长度和切片的容量。原创 2023-07-03 19:31:32 · 130 阅读 · 0 评论 -
go 语言string
在UTF-8编码下,许多常见的ASCII字符只需要一个字节来表示,而一些非ASCII字符(如汉字)可能需要多个字节。因此,字符串的长度计算是基于字节级别的,而不是字符级别。函数返回的是字符串的字节数,而不是字符个数。这是因为Go语言中的字符串是以字节序列的形式存储的,每个字符可能占用不同数量的字节,具体取决于字符的编码方式。总体而言,Go语言中的字符串提供了丰富的操作方法和函数,使得处理字符串变得简单和高效。函数,我们可以得到字符串中的实际字符个数,而不受字节数的影响。但是,如果字符串包含了多字节的字符,原创 2023-06-29 23:29:09 · 343 阅读 · 0 评论 -
struct嵌入(go 继承)
这是因为在 Go 中,如果结构体中包含了一个或多个匿名字段,那么这些字段的类型和字段名都会被继承到当前结构体中,就好像这些字段是当前结构体的直接字段一样。在这段代码中,定义了两个结构体。中的所有方法,所以在。结构体中可以直接访问。原创 2023-06-28 22:41:36 · 590 阅读 · 0 评论 -
结构体方法
在该代码中,Person类型的Greet方法的接收者类型是Person,表示该方法属于Person类型的对象。结构体方法可以访问结构体的成员变量,也可以修改结构体的状态。在该代码中,SetAge方法的接收者类型是*Person,表示该方法属于Person类型的指针对象。如果希望修改结构体对象的成员变量,需要使用指针类型的接收者和指针类型的方法。其中,接收者变量指定了方法所属的结构体对象,接收者类型指定了接收者变量的类型。接收者类型可以是结构体类型或指向结构体类型的指针类型。原创 2023-06-28 22:39:55 · 111 阅读 · 0 评论 -
结构体的定义与实例化
其中,结构体名是用户自定义的标识符,可以包含字母、数字和下划线。字段名是结构体成员的标识符,也可以包含字母、数字和下划线。类型可以是任意的Go语言数据类型,包括内置类型和其他自定义类型。在Go语言中,结构体是一种用户自定义的数据类型(复合类型,而非引用类型),可以用来封装多个不同类型的数据成员。该语句会在内存中创建一个新的Person类型的对象,并返回其指针。该语句会在内存中创建一个新的Person类型的对象,并返回其值。结构体的实例化可以使用new函数或者直接使用结构体字面量的方式。原创 2023-06-28 22:28:22 · 286 阅读 · 0 评论 -
切片常见操作
该函数会将源切片的元素复制到目标切片中,如果目标切片的长度不足,只会复制到目标切片的长度为止。切片是 Go 语言中常用的数据结构之一,具有灵活的长度和容量。如果追加的元素个数超过了切片的容量,那么会重新分配更大的内存空间。其中,长度表示切片中元素的个数,容量表示切片底层数组的长度。函数用于判断两个整型切片是否相等,如果长度不等或者元素不等,则返回。切片可以通过下标进行截取,即获取原切片的一部分。是相等的,因为它们长度相等,元素也都相等,而。,获取每个元素的下标和值,并打印出来。,以及一个不相等的切片。原创 2023-06-28 22:17:24 · 131 阅读 · 0 评论 -
切片的定义
在 Go 语言中,切片(Slice)是一个拥有相同类型元素的可变长序列,即一种动态数组,可以根据需要动态增长或缩小。切片是一个引用类型,它底层是一个数组,可以通过切片来访问数组中的元素。与数组相比,切片具有更高的灵活性和便利性。Slice的定义和数据的定义非常相似,有点像是没有长度的数据数组。原创 2023-06-28 22:13:23 · 504 阅读 · 1 评论 -
数组的定义
的变量会报错,因为Go语言的数组长度是数组的一部分,而不仅仅是存储数组的开始地址。在分配内存空间时,数组元素是紧挨着分配固定位置的,这也是数组长度不可变的原因。Go语言的数组都是传递值的,而通常其他语言的数组是引用传递。如果需要使用数组作为函数的参数,请使用指针,否则函数形参接收的数组只是副本,不仅浪费性能,对形参数组的修改无法影响原数组。需要注意的是,Go语言中的数组是固定长度的,因此在处理数据时可能会遇到一些限制。在声明数组时需要指定数组的长度和元素类型,一旦定义,数组的长度就不能再修改。原创 2023-06-20 00:11:41 · 59 阅读 · 0 评论 -
Linux安装go环境
其中$GOPATH是Go语言的工作目录,默认是$HOME/go。原创 2023-06-18 23:42:23 · 1204 阅读 · 0 评论 -
defer关键字
语句可以确保在函数返回前执行一些必要的清理操作,而无需在每个可能的返回点都进行显式的调用。时,不会立即执行该语句,而是在包含它的函数即将返回之前才执行。因此,打印的结果是逆序的。语句是按照后进先出(LIFO)的顺序执行的。在示例代码中,我们使用了一个。语句时需要注意推迟的函数调用的执行顺序,以及可能产生的副作用。引申出来的面试题for defer。循环,每次循环迭代都会推迟一个新的。在这个示例中,我们使用了一个。循环,并在每次循环迭代时使用。语句,所以在函数返回前,语句会按照逆序执行。原创 2023-06-18 23:57:25 · 38 阅读 · 0 评论