go
文章平均质量分 56
yuzhang_zy
现在的我不是最好的我,未来的我才是最好的我,每一篇博客都记录着我的成长
展开
-
Go 语言中使用 bufio.NewReader 等函数实现快读
Go 语言中如果标准输入的数据规模在 10 ^ 5 或者更大,那么如果直接使用 fmt.Scan() 和 fmt.Println() 函数读取数据和输出数据会非常慢,如果算法的时间复杂度更大一点就会超时,这个时候就需要借助于 bufio 包中的相关方法优化读取数据和输出数据的效率,可以使用 bufio.NewReader(),bufio.NewWriter(),fmt.Fscan(),fmt.Fprintln() 函数优化输入输出数据,我们可以使用 Go 语言生成一个 10 ^ 5 规模的数据简单测试一下(原创 2022-06-01 22:34:40 · 3477 阅读 · 0 评论 -
Go语言读取文件的常用方式
1. 使用os.Open(path)函数和Read()方法,os.open()函数创建文件句柄,Read()读取文件,path为读取文件的路径,最好写绝对路径这样不会出现错误,Read()方法需要传递一个byte切片,所以需要声明一个byte切片,声明一个切片data来记录读取文件的结果(可以阅读官方文档的给出的例子),当读取到文件末尾的时候Reda()方法返回的结果就是0,所以当n = 0的时候直接break即可:package mainimport ( "fmt" "io" "log"原创 2022-04-25 16:36:51 · 9250 阅读 · 0 评论 -
Go语言实现TCP通信
TCP协议为传输控制协议,TCP协议有以下几个特点:1. TCP是面向连接的传输层协议;2. 每条TCP连接只能有两个端点,每条TCP连接只能够是点对点的通信;3. TCP提供可靠的交付服务,保证传送的数据无差错、不丢失、不重要且有序;4. TCP提供全双工通信,允许双方在任何时候都能发送数据,为此TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据;5. TCP是面向字节流的;发送缓存用来暂存以下数据:① 发送应用程序传送给发送方TCP准备发送的数据;② TCP已发送但尚原创 2022-04-24 23:16:21 · 8087 阅读 · 0 评论 -
Go语言spider基础
go语言的爬虫与python类似,但是go语言爬取的效率更高,一般的爬取主要使用到ioutil,http,regexp,sync等相关的处理的包,ioutil包主要是读取和写入数据的工具包(包括将数据读取和写入文件),http是关于客户端与服务端请求操作的包,regexp是关于正则表达式匹配相关操作的包,sync是关于同步操作相关的包原创 2022-04-21 17:50:47 · 1146 阅读 · 0 评论 -
Go语言原子操作
什么是原子操作呢?原子操作就是具备原子性的操作,一个或者多个操作在cpu的执行过程中不被中断的特性,称为原子性,这些操作对外表现为一个不可分割的整体,要么全部执行,要么全部不执行;为了保证并发安全,可以使用Go语言的sync包中的Mutex类型调用加锁和解锁的方法,但是加锁操作因为涉及内核态的上下文切换会比较耗时、代价比较高,对于基本数据类型我们还可以使用原子操作来保证并发安全,因为原子操作在用户态就可以完成,所以性能比加锁操作更好,更能利用计算机的优势,对应的原子操作在内置的标准库sync/atomic可原创 2022-04-20 21:39:06 · 1564 阅读 · 0 评论 -
Go语言并发安全与锁
有时候在Go语言代码中可能会存在多个goroutine同时操作一个资源,这种情况会发生竞态问题(数据竞态)原创 2022-04-20 18:23:32 · 392 阅读 · 0 评论 -
Go语言select语句
在某些场景下我们需要同时从多个通道接收数据,通道在没有数据接收的时候就会发生阻塞,原创 2022-04-20 10:12:01 · 473 阅读 · 0 评论 -
Go语言定时器
包括一次性定时器(Timer)和周期性定时器(Ticker),一次性定时器:原创 2022-04-19 22:50:29 · 3351 阅读 · 0 评论 -
Go语言goroutine,runtime
很多语言在进行并发编程的时候需要自己维护一个线程池,包装一个个任务,并且需要自己去调度线程执行任务维护上下文的切换,而go语言为了我们提供了goroutine,我们可以定义很多的任务,让系统帮助我们把这些任务分配到cpu上实现并且执行,gorotinue类似于线程的概念,但是它是由go的运行时(runtime)调度和管理的,go程序会将goroutine中的任务合理地分配给每个cpu,在语言层面内置了调度和上下文切换的机制;在go语言的并发编程中我们只需要将任务保证成一个函数,开启一个goroutine去执原创 2022-04-19 10:08:14 · 672 阅读 · 0 评论 -
Go语言通道
函数单纯并发执行是没有意义的,函数与函数之间交换数据才可以体现并发执行函数的意义,其中Go语言的并发模型是csp模型,提倡通过通信共享内存而不是通过共享内存而实现通信,共享内存实现通信在不同的goroutine中容易发生竞态的问题,为了保证数据交换的正确性,必须使用互斥量对内存进行加锁,但是这种做法会造成性能上的一些问题。在go语言中,goroutine是go程序并发的执行体,go语言为goroutine之间提供了一个通信的桥梁:channel,也即goroutine之间的连接,channel是让一个gor原创 2022-04-18 23:15:46 · 717 阅读 · 0 评论 -
Go语言闭包
闭包是由函数以及相关引用环境组成的实体,即闭包 = 函数 + 引用环境,闭包在运行的时候可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例,很多语言其实包含了对闭包不同程序的支持,通过支持闭包的语法可以发现一个特点,他们都有垃圾回收机制,下面给出一个Go语言的例子来理解闭包的概念:package mainimport "fmt"func f() func() int { x := 10 a := func() int { x += 1 fmt.Println(x)原创 2022-04-18 21:28:00 · 303 阅读 · 0 评论 -
Go语言defer关键字
go语言的defer关键字用于延迟调用,下面是关于go语言defer关键字的一些基础概念:1. defer关键字用于注册延迟调用;2. 这些调用到直到包含当前该defer关键字的函数执行完了才会被执行;3. 如果定义了多个defer语句,按照先进后出的方式执行,也即后定义的defer语句会先被执行,这也比较好理解,如果之前的资源释放掉了,后面需要使用掉之前资源的语句就没法执行了;4. defer语句中的变量,在defer声明的时候就决定了,也即在defer语句中使用到的变量的值为在defer原创 2022-04-18 15:05:24 · 1161 阅读 · 0 评论 -
Go语言接口(面向对象)
在Go语言中,接口是一种抽象的类型,定义了一个对象的行为规范,是对行为的概括与抽象,只定义规范但是不实现,由实现接口的对象去定义具体的行为规范,Go语言的接口是一组方法的集合;Go语言接口类似于其他语言,相当于是提供一个规范,当我们看到一个接口的时候我们只知道它大概是用来干什么的。...原创 2022-04-14 20:55:35 · 3076 阅读 · 0 评论 -
Go语法方法
go语言的方法可以看成是特殊的函数,一个方法就是一个包含了接受者的函数,接受者可以是命名类型或者结构体类型的一个值或者是一个指针。方法定义语法规则:func (recevier type) methodName (参数列表) (返回值列表){},参数列表与返回值列表可以省略,方法比函数多了接受者这个东西:package mainimport "fmt"type Student struct { id int name string}// 无参数列表与返回值func (s原创 2022-04-14 10:55:48 · 434 阅读 · 0 评论 -
Go语言入门常见的一些问题
1. 如果未使用定义的变量编译是通不过的原创 2022-04-13 23:05:39 · 90 阅读 · 0 评论 -
Go语言结构体
Go语言不像c++,java,python等语言具有类的概念,也不支持"类"的继承与面向对象的概念,但是Go语言类似于c/c++语言可以使用结构体配合接口的方式表达比较复杂的数据结构,可以类比于python的元组,下面是关于Go语言结构体相关方面的知识点:原创 2022-04-12 11:28:49 · 1199 阅读 · 0 评论 -
Go语言排序
对于Go语言来说,主要对两种类型的数据进行排序:① 切片 ② 结构体,切片一般对应基本的数据类型,例如int,float类型的数字,字符串等基本数据类型的切片,对于结构体的排序,类似于python列表嵌套元组(或者是嵌套列表),例如python的列表:a = [(1,2,4),(3,4,2),(5,2,7)],python对列表中的元组排序可以使用python中的sort方法并且利用lambda表达式进行排序,lambda表达式可以自定义按照元组的第几个元祖进行排序:a.sort(key=lambda x:原创 2022-04-11 23:18:53 · 3441 阅读 · 0 评论 -
Go语言strconv包
1.strconv原创 2022-04-09 15:59:00 · 583 阅读 · 0 评论 -
Go语言bits包的位运算操作基础
Go语言的bits包实现了预先声明的无符号整数类型的位计数和相关操作函数,所以这个包主要是用来处理无符号类型的位运算操作的相关问题,下面是常见的位运算操作函数:① OnesCount函数,函数原型为:func OnesCount(x uint) int;返回的是uint类型整数x的二进制表示中1的个数:package mainimport ( "fmt" "math/bits")func main() { fmt.Printf("OnesCount(%b) = %d\n", 10,原创 2022-04-08 12:23:01 · 921 阅读 · 0 评论 -
Go语言字符串
Go语言的字符类型底层实际上是byte,byte其实是uint8的一个别名,可以看成是一个整数,字符串本身是不可以直接修改的,需要使用byte()函数将其转为byte数组,修改完成之后使用string()函数将其转为字符串,我们可以遍历一下字符串判断输出对应的类型。...原创 2022-04-07 23:14:44 · 554 阅读 · 0 评论 -
Go语言常量与变量
一般Go语言声明变量有两种方式:① 使用关键字var来声明一个变量,语法为 var name type,其中name为变量的名字,type为变量的类型,使用var关键字的时候可以在声明的时候初始化变量;② 使用:= 符号快速声明变量并进行初始化,语法为name := value,其中name为变量名,value为具体的值;...原创 2022-04-07 21:31:15 · 231 阅读 · 0 评论 -
Go语言哈希表基础
package mainimport ( "fmt")func main() { // 1. map类型的变量默认初始值为nil,需要使用make()函数来分配内存。语法为: make(map[KeyType]ValueType, [cap]) // 其中cap表示map的容量,该参数虽然不是必须的,但是我们应该在初始化map的时候就为其指定一个合适的容量 mp := make(map[string]int, 8) mp["a"] = 1 mp["b"] = 2 // 直接输出...原创 2022-04-07 18:26:02 · 1538 阅读 · 0 评论 -
Go语言fmt包中的输入输出基础
可以在官方页面下的Packages输入fmt,里面有这个包中各个函数的介绍以及相关的用法,fmt包主要用来处理输入输出,格式化等相关问题,里面还有相关的例子可以看看,也可以使用goland查看各个函数的用法,下面是常见的输入输出函数的用法:1. Scan函数,从标准输入中读取文本,以空格作为分隔符将读取到的值存储到对应类型的变量中,换行......原创 2022-04-07 16:10:04 · 691 阅读 · 0 评论 -
Go语言函数基础
函数是每一门语言都需要掌握的内容,通过函数我们可以将能够复用的代码封装在一个模块中方便我们后续的调用,所以函数其实也有利于模块化的开发,下面是go语言函数中常见的知识点:① go语言函数定义格式如下,使用func关键字来定义一个函数,函数声明包含一个函数名,参数列表, 返回值列表和函数体,如果函数没有返回值,则返回列表可以省略。func function_name([parameter list]) [return_types] { 函数体}package mainimp..原创 2022-04-07 10:26:26 · 516 阅读 · 0 评论 -
Go语言切片基础
go语言的切片并不是数组或数组指针,它通过内部指针和相关属性引用数组片段,以实现变长方案,下面是go语言切片的相关基础:① 创建切片,可以通过数组或者make函数来创建对应的切片,有点类似于python中的切片;② 操作切片,可以通过索引对切片中的元素进行修改,通过append函数向切片末尾添加元素,使用copy函数对切片进行拷贝,通过copy函数可以将一个切片中的元素拷贝到另外一个切片,以长度较短的切片为准,拷贝到另外一个切片之后会覆盖掉另外一个切片的元素;③ 切片遍历,类似于数组的遍历,可以使用rang原创 2022-04-06 23:12:54 · 1494 阅读 · 0 评论 -
Go语言数组基础
一般来说掌握一门语言的基础比较基础的是数组的定义,赋值和遍历,下面是常见一维数组和二维数组的定义,赋值和遍历的代码:package mainimport "fmt"func main() { // 一维数组 var a [5]int fmt.Println(a) // 未初始化的元素为0 b := [5]int{1, 2, 3, 4} fmt.Println(b) var arr = [...]int{2, 4, 6, 8, 10} fmt.Println(arr) fm原创 2022-04-05 22:31:55 · 218 阅读 · 0 评论 -
goland $GoPATH/go.mod exists but should not
goland配置的编译环境:goland的右上角可以找到一个下拉框,在这个下拉框中点击Edit Configuratuons:具体各个参数的设置可以看链接在配置好了goland软件的编译环境之后发现新建一个main下的test.go文件,运行之后报下面的错误:在网上查了一下资料其实是设置了GOPATH,就不同设置go mod,因为两个都是用来管理项目的,go mod是后面新版本的管理方式,我是直接删除GOPATH目录下的go.mod文件就可以直接编译了,当设置好编译环境之原创 2022-04-04 15:50:39 · 3369 阅读 · 0 评论 -
Go语言常见数据类型
go语言与c语言类似也有比较多的数据类型,我们可以在控制台输出简单的幂次方的值,在goland中可以按住ctrl + 鼠标点击需要查看的类,点击进去可以看到常见的数据类型并且可以看到对应的数据范围:// uint8 is the set of all unsigned 8-bit integers.// Range: 0 through 255.type uint8 uint8// uint16 is the set of all unsigned 16-bit integers.// Ra原创 2022-04-04 16:58:29 · 443 阅读 · 0 评论 -
Go语言学习
go语言快速入门原创 2022-04-01 22:48:35 · 442 阅读 · 0 评论