GO
文章平均质量分 92
go语言专栏
Binary Oracle
一名热爱开源和技术的Coder , 开源框架spring committer , golang开源网络库netpoll committer; (脱产备战25考研中,停更一年)
展开
-
Go 协程调度——基本原理与初始化
Go 协程调度——基本原理与初始化转载 2023-07-17 23:18:20 · 298 阅读 · 0 评论 -
Go短网址项目实战---下
通过逐步构建 goto 应用程序,我们遇到了几乎所有的 Go 语言特性。审美:用户界面可以(极大地)美化。为此可以使用 Go 的 template 包。可靠性:master/slave 之间的 RPC 连接应该可以更可靠:如果客户端到服务器之间的连接中断,客户端应该尝试重连。用一个“dialer” 协程可以达成。资源减负:由于 URL 数据库大小不断增长,内存占用可能会成为一个问题。可以通过多台 master 服务器按照键分片来解决。原创 2022-08-22 15:15:37 · 478 阅读 · 0 评论 -
Go短网址项目实战---上
有些浏览器中的地址(称为 URL)非常长且/或复杂,在网上有一些将他们转换成简短 URL 来使用的服务。添加 (Add): 给定一个较长的 URL,会将其转换成较短的版本,例如:(A) 转变为:http://goto/UrcGq(B) 并保存这对数据重定向 (Redirect)短网址被请求时,会把用户重定向到原始的长 URL。因此如果你在浏览器输入网址 (B),会被重定向到页面 (A)。原创 2022-08-21 23:25:51 · 366 阅读 · 0 评论 -
Go Web---RPC
Go 程序之间可以使用 net/rpc 包实现相互通信,这是另一种客户端-服务器应用场景。它提供了一种方便的途径,通过网络连接调用远程函数。当然,仅当程序运行在不同机器上时,这项技术才实用。rpc 包建立在 gob 包之上,实现了自动编码/解码传输的跨网络方法调用。rpc 包使用了 http 和 tcp 协议,以及用于数据传输的 gob 包。服务器端可以注册多个不同类型的对象(服务),但同一类型的多个对象会产生错误。T1 和 T2 必须能被 encoding/gob 包编码和解码。...原创 2022-08-18 17:04:11 · 268 阅读 · 0 评论 -
Go Web---Web服务器
使用闭包的错误处理模式是更优雅的方案。这可不妙:网页服务器必须是足够健壮的程序,能够承受任何可能的突发问题。首先能想到的是在每个处理函数中使用 defer/recover,不过这样会产生太多的重复代码。总结:第一个参数是请求的路径,第二个参数是当路径被请求时,需要调用的处理函数的引用。现在我们仍然要编写程序,以实现服务器必须做的事,即如何处理请求。是该表单中一个输入域的名称,那么用户输入的值就可以通过。被请求的时候(或者这个服务器上的其他任意地址),的字符到结尾的子切片”,用来丢弃路径开头的。......原创 2022-08-18 15:25:38 · 851 阅读 · 0 评论 -
Go Web---tcp服务器
这部分我们将使用 TCP 协议和之前讲到的协程范式编写一个简单的客户端-服务器应用,一个(web)服务器应用需要响应众多客户端的并发请求:Go 会为每一个客户端产生一个协程用来处理请求。然后一个独立的协程使用这个连接执行 doServerStuff(),开始使用一个 512 字节的缓冲 data 来读取客户端发送来的数据,并且把它们打印到服务器的终端,len 获取客户端发送的数据字节数;举例来说,一个网络爬虫程序在遇到临时发生的错误时可能会休眠或者重试,如果是一个必然发生的错误,则他会放弃继续执行。....原创 2022-08-18 11:10:00 · 615 阅读 · 0 评论 -
GoLang协程与通道---下
假设我们需要处理很多任务;一个worker处理一项任务。任务可以被定义为一个结构体(具体的细节在这里并不重要):旧模式:使用共享内存进行同步由各个任务组成的任务池共享内存;为了同步各个worker以及避免资源竞争,我们需要对任务池进行加锁保护:sync.Mutex:它用来在代码中保护临界区资源:同一时间只有一个go协程(goroutine)可以进入该临界区。如果出现了同一时间多个go协程都进入了该临界区,则会产生竞争:Pool结构就不能保证被正确更新。在传统的模式中(经典的面向对象的语言中应用得比较多,原创 2022-08-17 16:50:39 · 676 阅读 · 0 评论 -
GoLang协程与通道---中
此外,需要注意在有多个 case 符合条件时, select 对 case 的选择是伪随机的,如果上面的代码稍作修改如下,则 select 语句可能不会在定时器超时信号到来时立刻选中 time.After(timeoutNs) 对应的 case,因此协程可能不会严格按照定时器设置的时间结束。再次声明,结果通道 ch 必须是带缓冲的:以保证第一个发送进来的数据有地方可以存放,确保放入的首个数据总会成功,所以第一个到达的值会被获取而与执行的顺序无关。select监听进入通道的数据,也可以是用通道发送值的时候。.原创 2022-08-17 10:47:09 · 609 阅读 · 0 评论 -
GoLang协程与通道---上
一个应用程序是运行在机器上的一个进程;进程是一个运行在自己内存地址空间里的独立执行体。一个进程由一个或多个操作系统线程组成,这些线程其实是共享同一个内存地址空间的一起工作的执行体。几乎所有’正式’的程序都是多线程的,以便让用户或计算机不必等待,或者能够同时服务多个请求(如 Web 服务器),或增加性能和吞吐量(例如,通过对不同的数据集并行执行代码)。一个并发程序可以在一个处理器或者内核上使用多个线程来执行任务,但是只有同一个程序在某个时间点同时运行在多核或者多处理器上才是真正的并行。...原创 2022-08-16 23:26:21 · 422 阅读 · 0 评论 -
GoLang异常
err!= nil {由于 fmt.Printf 会自动调用 String() 方法 ,所以错误信息 “Error: math - square root of negative number” 会打印出来。通常(错误信息)都会有像 “Error:” 这样的前缀,所以你的错误信息不要以大写字母开头。在大部分情况下自定义错误结构类型很有意义的,可以包含除了(低层级的)错误信息以外的其它有用信息,例如,正在进行的操作(打开文件等),全路径或名字。.........原创 2022-08-16 15:27:59 · 592 阅读 · 0 评论 -
GoLang读写数据---下
json.NewEncoder() 的函数签名是 func NewEncoder(w io.Writer) *Encoder,返回的Encoder类型的指针可调用方法 Encode(v interface{}),将数据对象 v 的json编码写入 io.Writer w 中。通过网络传输的数据必须加密,以防止被 hacker(黑客)读取或篡改,并且保证发出的数据和收到的数据检验和一致。这样的数据格式可以通过网络传输,而且是与平台无关的,任何类型的应用都能够读取和输出,不与操作系统和编程语言的类型相关。...原创 2022-08-16 14:21:17 · 360 阅读 · 0 评论 -
GoLang读写数据---中
Fprintf() 能够写入任何类型,只要其实现了 Write 方法,包括 os.Stdout,文件(例如 os.File),管道,网络连接,通道等等,同样的也可以使用 bufio 包中缓冲写入。如果找到标志,将其值存入对应的变量。切片提供了 Go 中处理 I/O 缓冲的标准方式,下面 cat 函数的第二版中,在一个切片缓冲内使用无限 for 循环(直到文件尾部 EOF)读取文件,并写入到标准输出(os.Stdout)。,用来处理一些基本的命令行参数,它在程序启动后读取命令行输入的参数。...原创 2022-08-16 12:13:54 · 273 阅读 · 0 评论 -
GoLang读写数据---上
但是scan却可以,它虽然没有收走缓冲区的回车符,但是不会把回车符读进去,遇到回车它会继续读取下一个数据,而scanf会按照我们给的格式(如%d去读取数据),但是肯定读不进去的,所以就读取失败了。在 Go 语言中,文件使用指向 os.File 类型的指针来表示的,也叫做文件句柄。如果您想这么做,可以使用 io/ioutil 包里的 ioutil.ReadFile() 方法,该方法第一个返回值的类型是 []byte,里面存放读取到的内容,第二个返回值是错误,如果没有错误发生,第二个返回值为 nil。.....原创 2022-08-15 23:11:18 · 665 阅读 · 0 评论 -
GoLang反射
反射是 Go 语言比较重要的特性。虽然在大多数的应用和服务中并不常见,但是很多框架都依赖 Go 语言的反射机制实现简化代码的逻辑。因为 Go 语言的语法元素很少、设计简单,所以它没有特别强的表达能力,但是 Go 语言的 reflect 包能够弥补它在语法上的一些劣势。reflect 实现了运行时的反射能力,能够让程序操作不同类型的对象。...原创 2022-08-15 16:06:02 · 6048 阅读 · 0 评论 -
GoLang接口---下
Go 的实现与此相反,通常需要编译器静态检查的支持:当变量被赋值给一个接口类型的变量时,编译器会检查其是否实现了该接口的所有函数。和其它语言相比,Go 是唯一结合了接口值,静态类型检查(是否该类型实现了某个接口),运行时动态转换的语言,并且不需要显式地声明类型是否满足某个接口。是非常有用的设计模式,可以减少需要的类型和方法数量,而且不需要像传统的基于类的面向对象语言那样维护整个的类层次结构。当一个类型包含(内嵌)另一个类型(实现了一个或多个接口)的指针时,这个类型就可以使用(另一个类型)所有的接口方法。..原创 2022-08-15 14:33:59 · 447 阅读 · 0 评论 -
GoLang接口---中
在类型转换时,*TestStruct 类型会转换成 interface{} 类型,转换后的变量不仅包含转换前的变量,还包含变量的类型信息 TestStruct,所以转换后的变量与 nil 不相等。变量 t 得到了 areaIntf 的值和类型, 所有 case 语句中列举的类型(nil 除外)都必须实现对应的接口(在上例中即 Shaper),如果被检测类型没有在 case 语句列举的类型中,就会执行 default 语句。一个接口的值可以赋值给另一个接口变量,只要底层类型实现了必要的方法。...原创 2022-08-15 12:35:27 · 1174 阅读 · 0 评论 -
GoLang接口---上
Go 语言不是一种 “传统” 的面向对象编程语言:它里面没有类和继承的概念。但是 Go 语言里有非常灵活的接口概念,通过它可以实现很多面向对象的特性。如果谁能搞定这件事,它就可以用在这儿。接口定义了一组方法(方法集),但是这些方法不包含(实现)代码:它们没有被实现(它们是抽象的)。接口里也不能包含变量。,ai 是一个多字(multiword)数据结构,它的值是 nil。它本质上是一个指针,虽然不完全是一回事。指向接口值的指针是非法的,它们不仅一点用也没有,还会导致代码错误。.........原创 2022-08-14 17:52:07 · 508 阅读 · 0 评论 -
Goland环境下同一个package下出现undefined
Go 中 main 包默认不会加载其他文件, 而其他包都是默认加载的。如果 main 包有多个文件,则在执行的时候需要将其它文件都带上,即执行 go run *.go。按道理讲同一个包内的函数是可以互相调用访问的,但是此处报错,提示 undefined: hello。...原创 2022-08-14 12:15:34 · 1432 阅读 · 0 评论 -
Go语言笔记----GoMoudle
Go语言笔记----GoMoudleGo Path模式gopath缺陷GoMoudleGo mod命令go mod环境变量通过 go env来查看环境变量使⽤Go Modules初始化项⽬1 开启Go Modules模块2 初始化项⽬修改指定版本模块的依赖关系参考文章Go Path模式GOPATH可以将其理解为工作目录,在这个工作目录下,通常有如下的目录结构每个目录存放的文件,都不相同 bin:存放编译后生成的二进制可执行文件 pkg:存放编译后生成的 .a 文件 src:存放项目的源代码原创 2022-04-03 22:23:45 · 741 阅读 · 0 评论 -
Go语言笔记----goroutine和channel
Go语言笔记----goroutine和channelgoroutine基本模型和调度设计策略Go对协程的处理Go对早期调度器的处理老的调度器缺点GMP调度器的设计策略复用线程work stealing机制hand off机制利用并行抢占策略全局G队列创建goroutineChannel基本定义和使用channel有缓冲和无缓冲同步问题无缓冲的channel有缓冲的ChannelChannel的关闭Channel和RangeChannel与selectgoroutine基本模型和调度设计策略单进程时原创 2022-04-03 18:04:30 · 697 阅读 · 0 评论 -
Go语言笔记----基础语法
Go语言笔记----基础语法局部变量,全局变量,多变量声明const与iota函数多返回值init函数与import导包包内方法名大小写区别import匿名及别名导包方式defer语句调用顺序数组切片---动态数组动态数组slice的截取和追加append追加元素截取元素如何实现深拷贝呢?---->copy函数mapmap的基本使用面向对象特征struct结构体面向对象类的表示和封装继承多态interface空接口万能类型与类型断言机制反射变量的内置pair结构反射reflect机制用法reflect原创 2022-04-01 16:57:21 · 484 阅读 · 0 评论