05 2022 档案

摘要:理解类型与接口的关系 类型和接口之间有一对多和多对一的关系,下面将列举出这些常见的概念,以方便理解接口与类型在复杂环境下的实现关系。 一、一个类型可以实现多个接口 一个类型可以同时实现多个接口,而接口间彼此独立,不知道对方的实现。 网络上的两个程序通过一个双向的通信连接实现数据的交换,连接的一端称为 阅读全文
posted @ 2022-05-31 18:47 左扬 阅读(110) 评论(0) 推荐(0) 编辑
摘要:实现接口的条件 接口定义后,需要实现接口,调用方才能正确编译通过并使用接口。接口的实现需要遵循两条规则才能让接口可用。 一、接口被实现的条件一:接口的方法与实现接口的类型方法格式一致 在类型中添加与接口签名一致的方法就可以实现该方法。签名包括方法中的名称、参数列表、返回参数列表。也就是说,只要实现接 阅读全文
posted @ 2022-05-31 17:06 左扬 阅读(337) 评论(0) 推荐(0) 编辑
摘要:接口(inteface) 接口本身是调用方和实现方均需要遵守的一种协议,大家按照统一的方法命名参数类型和数量来协调逻辑处理的过程。 Go 语言中使用组合实现对象特性的描述。对象的内部使用结构体内嵌组合对象应该具有的特性,对外通过接口暴露能使用的特性。 Go 语言的接口设计是非侵入式的,接口编写无须知 阅读全文
posted @ 2022-05-31 00:02 左扬 阅读(306) 评论(0) 推荐(0) 编辑
摘要:示例:使用匿名结构体分离 JSON 数据 手机拥有屏幕、电池、指纹识别等信息,将这些信息填充为 JSON 格式的数据。如果需要选择性地分离 JSON 中的数据则较为麻烦。Go 语言中的匿名结构体可以方便地完成这个操作。 代码1-1 JSON 数据分离(具体文件:.../splitejson.go) 阅读全文
posted @ 2022-05-30 23:35 左扬 阅读(137) 评论(0) 推荐(0) 编辑
摘要:类型内嵌和结构体内嵌 结构体允许其他成员字段在声明时没有字段名而只有类型,这种形式的字段被称为类型内嵌或匿名字段。 类型内嵌的写法如下: type Data struct{ int float32 bool } ins := &Data{ int: 10, float32: 3.14, bool: 阅读全文
posted @ 2022-05-30 23:11 左扬 阅读(456) 评论(0) 推荐(0) 编辑
摘要:示例:使用事件系统实现事件的响应和处理 Go 语言可以将类型的方法与普通函数视为一个概念,从而简化方法和函数混合作为回调类型时的复杂性。这个特性和 C# 中的代理(delegate)类似,调用者无须关心谁来支持调用,系统会自动处理是否调用普通函数或类型的方法。 本节中,首先将用简单的例子了解 Go 阅读全文
posted @ 2022-05-30 18:48 左扬 阅读(269) 评论(0) 推荐(0) 编辑
摘要:为类型添加方法 Go 语言可以对任何类型添加方法。给一种类型添加方法就像给结构体添加方法一样,因为结构体也是一种类型。 一、为基本类型添加方法 在 Go 语言中,使用 type 关键字可以定义出新的自定义类型。之后就可以为自定义类型添加各种方法。我们习惯于使用面向过程的方式判断一个值是否为0,例如: 阅读全文
posted @ 2022-05-30 15:59 左扬 阅读(180) 评论(0) 推荐(0) 编辑
摘要:示例:二维矢量模拟玩家移动 在游戏中,一般使用二维矢量保存玩家的位置。使用矢量运算可以计算出玩家移动的位置。本例子中,首先实现二维矢量对象,接着构造玩家对象,最后使用矢量对象和玩家对象共同模拟玩家移动的过程。 1、实现二维矢量结构 矢量是数学中的概念,二维矢量拥有两个方向的信息,同时可以进行加、减、 阅读全文
posted @ 2022-05-30 15:31 左扬 阅读(148) 评论(0) 推荐(0) 编辑
摘要:方法 Go 语言中的方法(Method)是一种作用于特定类型变量的函数。这种特定类型变量叫做接收器(Receiver)。 如果将特定类型理解为结构体或者"类"时,接收器的概念就类似于其他语言中的 this 或 self。 在 Go 语言中,接收器的类型可以是任何类型,不仅仅是结构体,任何类型都可以拥 阅读全文
posted @ 2022-05-30 12:01 左扬 阅读(435) 评论(0) 推荐(0) 编辑
摘要:构造函数——结构体和类型的一系列初始化操作的函数封装 Go 语言的类型或结构体没有构造函数的功能。结构体的初始化过程可以使用函数封装实现。 提示:其他编程语言构造函数的一些常见功能及特性如下: 1、每个类可以添加构造函数,多个构造函数使用函数重载实现。 2、构造函数一般与类名同名,且没有返回值。 3 阅读全文
posted @ 2022-05-29 23:31 左扬 阅读(124) 评论(0) 推荐(0) 编辑
摘要:初始化结构体的成员变量 结构体在实例化时可以直接对成员变量进行初始化。 初始化有两种形态: 1、字段 "键值对" 形式及多个值的列表形式。(键值对形式的初始化适合选择性填充字段较多的结构体) 2、多个值的列表形式适合填充字段较少的结构体。 一、使用“键值对”初始化结构体 结构体可以使用“键值对”(k 阅读全文
posted @ 2022-05-29 23:04 左扬 阅读(479) 评论(0) 推荐(0) 编辑
摘要:定义结构体、实例化结构体 Go 语言通过自定义的方式形成新的类型,结构体是类型中带有成员的复合类型。Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性。 Go 语言中的类型可以被实例中,使用 new 或 "&" 构造的类型实例的类型是类型的指针。 结构体成员是由一系列的成员变量 阅读全文
posted @ 2022-05-28 23:58 左扬 阅读(589) 评论(0) 推荐(0) 编辑
摘要:宕机恢复(recover)——防止程序崩溃 无论是代码运行错误由 Runtime 层抛出的 panic 崩溃,还是主动触发的 panic 崩溃,都可以配合 defer 和 recover 实现错误捕捉和恢复,让代码在发生崩溃后允许继续运行。 提示: 在其他语言里,宕机往往以一场的形式存在,底层抛出一 阅读全文
posted @ 2022-05-28 23:12 左扬 阅读(567) 评论(0) 推荐(0) 编辑
摘要:宕机(panic)——程序终止运行 一、手动触发宕机 Go 语言可以在程序中手动触发宕机,让程序崩溃,这样开发者可以及时地发现错误,同时减少可能的损失。 Go 语言程序在宕机时,会将堆栈和goroutine信息输出到控制台,所以宕机也可以方便地知晓发生错误的位置。 如何触发宕机呢? package 阅读全文
posted @ 2022-05-28 22:39 左扬 阅读(435) 评论(0) 推荐(0) 编辑
摘要:在解析中使用自定义错误 使用 error.New 定义的错误字符串的错误类型是无法提供丰富的错误信息的。那么,如果需要携带错误信息返回,就需要借助自定义结构体实现错误接口。 下面代码将实现一个错误解析(ParseError),这种错误包含两个内容:文件名和行号。解析错误的结构还实现了 error 接 阅读全文
posted @ 2022-05-28 18:32 左扬 阅读(142) 评论(0) 推荐(0) 编辑
摘要:处理运行时发生的错误 Go 语言的错误处理思想及设计包含以下特征: 一个可能造成错误的函数,需要返回值中翻译个错误接口(error)。如果调用是成功的,错误接口返回nil,否则返回错误。 在函数调用后需要检查错误,如果发生错误,进行必要的错误处理。 一、net包中的例子 net.Dial()是 Go 阅读全文
posted @ 2022-05-28 16:25 左扬 阅读(81) 评论(0) 推荐(0) 编辑
摘要:可变参数——参数数量不固定的函数形式 Go 语言支持可变参数特性,函数声明和调用时没有固定数量的参数,同时也提供了一套方法进行可变参数的多级传递。 Go 语言的可变参数格式如下: func 函数名(固定参数列表, v...T)(返回参数列表){ 函数体 } 特性如下: 可变参数一般被放置在函数列表的 阅读全文
posted @ 2022-05-28 15:49 左扬 阅读(378) 评论(0) 推荐(0) 编辑
摘要:示例:闭包实现生成器 闭包的记忆效应进程被用于实现类似设计模式中工厂模式的生成器。 下面我们创建一个玩家生成器的过程。 package main import "fmt" //创建一个玩家生成器,输入名称,输出生成器 func playerGen(name string) func() (strin 阅读全文
posted @ 2022-05-28 14:48 左扬 阅读(50) 评论(0) 推荐(0) 编辑
摘要:示例:闭包的记忆效应 闭包对它作用域上部变量的引用可以进行修改,修改运用的变量就会对变量进行实际修改。 被捕获到闭包中的变量让闭包本身拥有了记忆效应,闭包中的逻辑可以修改闭包捕获的变量,变量会跟随闭包声明周期一直存在,闭包本身就如同变量一样拥有了记忆效应。 package main import " 阅读全文
posted @ 2022-05-28 14:36 左扬 阅读(51) 评论(0) 推荐(0) 编辑
摘要:热加载更新配置 在 Prometheus 的日常维护中,一定会对配置文件 prometheus.yml 进行再编辑操作,通常对 Prometheus 服务进行重启操作即可完成对配置文件的加载。 当然也可以通过动态的热加载来更新 prometheus.yml 中的配置信息,一般热加载有两种方法: 查看 阅读全文
posted @ 2022-05-25 17:34 左扬 阅读(890) 评论(0) 推荐(0) 编辑
摘要:闭包(Closure)——引用了外部变量的匿名函数 闭包是引用了自由变量的函数,被引用的自由变量和函数一同存在,即使已经离开了自由变量的环境也不会被释放或者删除,在闭包中可以继续使用这个自由变量。因此,简单的说: 函数+引用环境=闭包 同一个函数与不同引用环境组合,可以形成不同的实例,如下图: 一个 阅读全文
posted @ 2022-05-17 00:50 左扬 阅读(236) 评论(0) 推荐(0) 编辑
摘要:函数类型实现接口(把函数作为接口来调用) 函数和其他类型一样都属于 "一等公民",其他类型能够实现接口,函数也可以。 我们对比下结构体和函数实现接口的过程。 先实现一个接口: //调用器接口 type Invoker interface { //需要实现一个 Call() 方法 Call(inter 阅读全文
posted @ 2022-05-16 23:58 左扬 阅读(283) 评论(0) 推荐(1) 编辑
摘要:关于golang指针的理解和引用 引用:https://studygolang.com/articles/29273 一、Go指针理解 Go 有指针,但是没有指针运算。你不能用指针变量遍历字符串的各个字节。在 Go 中调用函数的时候,得记得变量是值传递的。 通过类型作为前缀来定义一个指针’ * ’: 阅读全文
posted @ 2022-05-16 22:21 左扬 阅读(1895) 评论(0) 推荐(0) 编辑
摘要:同步——保证并发环境下数据访问的准确性(竞态检测、互斥锁、读写互斥锁) Go 程序可以使用通道进行多个 goroutine 间的数据交换,但这仅仅是数据同步中的一种方法。通道内部的实现依然使用了各种锁,因此优雅代码的代价是性能。在某些轻量级的场合,原子访问(atomic包)、互斥锁(sync.Mut 阅读全文
posted @ 2022-05-14 00:31 左扬 阅读(158) 评论(0) 推荐(0) 编辑
摘要:示例:Telnet 回音服务器——TCP服务器的基本结构 本节使用 Go 语言中的 Socket、goroutine 和通道编写一个简单的 Telnet 协议的回音服务器。 回音服务器的代码分成4个部分,分别是接受连接、会话处理、Telnet 命令处理和程序入口。 1、接受连接 Go 语言中可以根据 阅读全文
posted @ 2022-05-11 14:47 左扬 阅读(309) 评论(0) 推荐(0) 编辑
摘要:centos8.0 使用kubeadm部署 k8s-v1.18.20+etcd-v3.4.3+flannel-v0.10.0 高可用集群 一、资源规划: 主机名 IP地址 配置 角色 系统版本 k8s-master01 10.100.12.168 2C2G master/Work/etcd cent 阅读全文
posted @ 2022-05-11 14:12 左扬 阅读(622) 评论(0) 推荐(0) 编辑
摘要:关闭通道后继续使用通道 通道是一个引用对象,和 map 类似。map 在没有任何外部引用时 ,Go 程序在运行(runtime)会自动对内存进行垃圾回收(Garbage Collection,GC)。类似的,通道也可以被垃圾回收,但是通道也可以被主动关闭的。 1、格式 使用 close() 来关闭一 阅读全文
posted @ 2022-05-11 14:11 左扬 阅读(248) 评论(0) 推荐(0) 编辑
摘要:示例:使用通道响应计时器的事件 Go语言中的 time 包提供了计时器的封装。 由于 Go 语言中的通道和 goroutine 的设计,定时任务可以在 goroutine 中通过同步的方式完成,也可以通过 goroutine 中异步回调完成。 1、一段时间之后(time.After) package 阅读全文
posted @ 2022-05-11 13:29 左扬 阅读(129) 评论(0) 推荐(0) 编辑
摘要:示例:模拟远程过程调用(RPC) 服务器开发中会使用 RPC(Remote Procedure Call,远程过程调用)简化进程间通信的过程。RPC 能有效低封装通信过程,让远程的数据收发通信过程看起来就像本地的函数调用一样。 本例中,使用通道替代 Socket 实现 RPC 的过程。客户端与服务器 阅读全文
posted @ 2022-05-11 13:14 左扬 阅读(149) 评论(0) 推荐(0) 编辑
摘要:通道的多路复用——同时处理接收和发送多个通道的数据 多路复用是通信和网络中的一个专业术语。多路复用通常表示一个信道上传输多路信号和数据流的过程和技术。 在使用通道时,想同时接收多个通道的数据是一件困难的事情。通道在接收数据时,如果没有数据可以接收将会发生阻塞。虽然可以使用如下模式进行遍历,但运行性能 阅读全文
posted @ 2022-05-11 12:41 左扬 阅读(381) 评论(0) 推荐(0) 编辑
摘要:带缓冲的通道 在无缓冲通道的基础上,为通道增加一个有限大小的存储空间形成带缓冲通道。 带缓冲通道在发送时无需等待接收方接收即可完成发送过程,并且不会发生阻塞,只有当存储空间满时,才会发生阻塞。 带缓冲通道有数据时,接收方将不会发生阻塞,直到通道中没有数据可读时,通道将会再读阻塞。 1、创建带缓冲通道 阅读全文
posted @ 2022-05-11 12:15 左扬 阅读(224) 评论(0) 推荐(0) 编辑
摘要:单向通道——通道中的单行道 Go 的通道可以在声明时约束其操作方向,如只发送或是只接收。这种约束方向的通道被称为单向通道。 1、单向通道的声明格式 var 通道实例 chan<- 元素类型 // 只能发送通道 var 通道实例 <-chan 元素类型 // 只能接收通道 元素类型:通道包含的元素类型 阅读全文
posted @ 2022-05-11 12:11 左扬 阅读(206) 评论(0) 推荐(0) 编辑
摘要:并发打印 使用无缓冲通道往里面装入数据时,装入方将被阻塞,直到另外通道在另外一个 goroutine 中被取出。同样,如果通道中没有放入任何数据,接收方试图从通道中获取数据时,同样被阻塞。发送和接收的操作是同步完成的。 package main import "fmt" func printer(c 阅读全文
posted @ 2022-05-11 11:47 左扬 阅读(72) 评论(0) 推荐(0) 编辑
摘要:在多个 goroutine 间通信的管道——通道(Channel) 单纯地将函数并发执行是没有意义的。函数与函数间需要交换数据才能体现并发执行函数的意义。 虽然可以使用共享内存进行数据交换,但是共享内存在不同的 goroutine 中容易发生竟态问题。为了保证数据交换的正确性,必须使用互斥量对内存进 阅读全文
posted @ 2022-05-11 00:10 左扬 阅读(470) 评论(0) 推荐(0) 编辑
摘要:调整并发的运行性能(GOMAXPROCS) 在 Go 运行时(runtime)实现了一个小型的任务调度器。这套调度器的工作原理类似操作系统调度线程,Go 程序调度器可以高效地将 CPU 资源分配给每一个任务。传统逻辑中,开发者需要维护 线程池中线程 与 CPU 核心数量的对应关系。同样的,Go 中也 阅读全文
posted @ 2022-05-11 00:03 左扬 阅读(420) 评论(0) 推荐(0) 编辑
摘要:使用匿名函数创建 goroutine go 关键字后也可以为匿名函数或闭包启动 goroutine。 一、使用匿名函数创建 goroutine 的方式 使用匿名函数或闭包创建 goroutine 时,除了将函数定义部分写在 go 的后面之外,还需要加上匿名函数的调用参数,格式如下: go runc( 阅读全文
posted @ 2022-05-10 23:53 左扬 阅读(200) 评论(0) 推荐(0) 编辑
摘要:轻量级线程(goroutine)——根据需要随时创建的“线程” 一、什么是 goroutine? 在编写 Socket 网络程序时,需要提前准备一个线程池为每一个 Socket 的收发包分配一个线程。开发人员需要为 线程数量 和 CPU 间建立一个对应关系,以保证每个任务能及时地分配到 CPU 上进 阅读全文
posted @ 2022-05-10 23:24 左扬 阅读(203) 评论(0) 推荐(0) 编辑
摘要:并发和并行 并发和并行区别。 并发(concurrency):把任务在不同的时间点交给处理器进行处理。在同一时间点,任务并不会同时运行。 并行(parallelism):把每一个任务分配给每一个处理器独立完成。在同一时间点,任务一定是同时运行。 Go 语言通过编译器运行时(runtime),在语言上 阅读全文
posted @ 2022-05-10 23:12 左扬 阅读(51) 评论(0) 推荐(0) 编辑
摘要:将 "秒" 解析为时间单位 在本例中,使用一个数值表示时间中的 "秒" 值,然后使用 resolveTime() 函数将传入的秒数转换为天、小时和分钟等时间单位。 package main import ( "fmt" ) const ( //定义每分钟的秒数 SecondsPerMinute = 阅读全文
posted @ 2022-05-10 12:42 左扬 阅读(135) 评论(0) 推荐(0) 编辑

levels of contents
点击右上角即可分享
微信分享提示