<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Mossil的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Mossil</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Mossil]]></copyright><item><title><![CDATA[Go-map集合]]></title><link>https://blog.youkuaiyun.com/Mossil/article/details/121954253</link><guid>https://blog.youkuaiyun.com/Mossil/article/details/121954253</guid><author>Mossil</author><pubDate>Wed, 15 Dec 2021 16:48:51 +0800</pubDate><description><![CDATA[map集合是一种无序的key-value的数据结构，在Go中的map是引用类型，必须初始化才能使用
map是一种无序的键值对集合，可以通过key来快速的检索value，key类似索引，指向数据的值。
我们可以像数组和切片一样迭代map，但因为其是无需的，所以我们无法决定它的返回顺序
定义格式：map[KeyType]ValueType，KeyType：键类型，ValueType：值类型，map初始值为nil，需要使用make()函数来分配内存，make(map[KeyType]ValueType, [ca.]]></description><category></category></item><item><title><![CDATA[Go-数组与切片]]></title><link>https://blog.youkuaiyun.com/Mossil/article/details/121541464</link><guid>https://blog.youkuaiyun.com/Mossil/article/details/121541464</guid><author>Mossil</author><pubDate>Thu, 25 Nov 2021 18:20:43 +0800</pubDate><description><![CDATA[1. 数组

数组是同一类型数据的固定长度的序列
数组的定义格式为 var 数组名[长度]类型
数组长度是其类型的一部分，一旦定义，不能更改，例如var a[5]int和var a[8]int这两个数组不是同一类型
数组使用下表访问，第一个元素从0开始，最后一个为长度-1，若访问越界会Panic
数组是值类型，若赋值或当成参数传递会复制整个数组，若改变副本值原始数组不会发生改变
支持 “==“或”!=” 操作符，因为内存总是被初始化过的
数组指针为*[length]T
指针数组为[length]*T
可以使]]></description><category></category></item><item><title><![CDATA[Go-指针]]></title><link>https://blog.youkuaiyun.com/Mossil/article/details/121426856</link><guid>https://blog.youkuaiyun.com/Mossil/article/details/121426856</guid><author>Mossil</author><pubDate>Fri, 19 Nov 2021 17:10:40 +0800</pubDate><description><![CDATA[&amp;：取地址
*：根据变量地址取值

1. 指针地址：每个变量在运行都有一个地址，这个地址代表变量在内存中的地址，Go语言中使用&amp;字符放在变量前面对变量进行“取地址”操作
2. 指针类型：Go语言中的值类型（int、float、bool、string、array、struct）都有对应的指针类型，如：*int、*int64、*string等
3. 变量取值：在对普通变量使用&amp;操作符取地址后会获得这个变量的指针，然后可以对指针使用*操作，也就是指针取值
4. 空指针：当一个指针被定义后.]]></description><category></category></item><item><title><![CDATA[Go-for循环]]></title><link>https://blog.youkuaiyun.com/Mossil/article/details/121426344</link><guid>https://blog.youkuaiyun.com/Mossil/article/details/121426344</guid><author>Mossil</author><pubDate>Fri, 19 Nov 2021 16:51:57 +0800</pubDate><description><![CDATA[在Go中for循环有三种呈现形式

for init; condition; post { }
for condition { }
for { }
init：一般是赋值表达式，给控制变量赋初始值；condition：关系表达式或逻辑表达式，循环控制条件；post：一般为赋值表达式，给控制变量增量或减量

str := "abc"
for i := 0; i &lt; len(str); i++{
	fmt.Println(str[i])
}
strLen := len(str)
for strLen &gt]]></description><category></category></item><item><title><![CDATA[Go-流程控制]]></title><link>https://blog.youkuaiyun.com/Mossil/article/details/121424964</link><guid>https://blog.youkuaiyun.com/Mossil/article/details/121424964</guid><author>Mossil</author><pubDate>Fri, 19 Nov 2021 16:39:46 +0800</pubDate><description><![CDATA[1. if
在Go中，if语法有以下几个特点需要注意

可以省略条件表达式的括号
初始化语句可以定义代码块局部变量
代码块左括号必须在条件表达式尾部
不支持类似PHP中的三目运算符

// if条件语句格式如下：
if 布尔表达式 {
	// 代码块
}

if str := "abc";i &gt; 0 {
	fmt.Println(str[0])
} else if i &lt; 0 {
	fmt.Println(str[1])
} else {
	fmt.Println(str[2])
}

2. s]]></description><category></category></item><item><title><![CDATA[Go- import和package的使用]]></title><link>https://blog.youkuaiyun.com/Mossil/article/details/121384625</link><guid>https://blog.youkuaiyun.com/Mossil/article/details/121384625</guid><author>Mossil</author><pubDate>Wed, 17 Nov 2021 18:31:47 +0800</pubDate><description><![CDATA[在Go中使用包package来管理定义模块，可以使用import关键字来导入使用。
如果导入的是go自带的包，则会去安装目录$GOROOT/src按包路径加载，如fmt包
如果是我们go get安装或自定义的包，则会去$GOPATH/src下加载

package的定义

package的存放位置是以$GOPATH/src作为根目录，然后灵活的按照目录去组织，而且包名需与最后一级目录名一致。

import的定义

普通导入就是按照加载机制，将要使用的包导入进来，然后使用 packageName.Meth.]]></description><category></category></item><item><title><![CDATA[Go-init函数与main函数]]></title><link>https://blog.youkuaiyun.com/Mossil/article/details/121384408</link><guid>https://blog.youkuaiyun.com/Mossil/article/details/121384408</guid><author>Mossil</author><pubDate>Wed, 17 Nov 2021 18:16:50 +0800</pubDate><description><![CDATA[1. main函数
func main() {
	// 函数体
}


Go语言程序的默认入口函数，main函数只能用于main包中，且只能定义一个，类似PHP框架中的index.php

2. init函数

Go语言中init函数用于包(package)的初始化，该函数是go语言的一个重要特性，用途类似于PHP中的__construct魔术方法
init函数是用于程序执行前做包的初始化的函数，比如初始化包里的变量等
每个包可以拥有多个init函数
包的每个源文件也可以拥有多个init函数
同一个包中多个]]></description><category></category></item><item><title><![CDATA[Go-类型声明及作用域]]></title><link>https://blog.youkuaiyun.com/Mossil/article/details/121383712</link><guid>https://blog.youkuaiyun.com/Mossil/article/details/121383712</guid><author>Mossil</author><pubDate>Wed, 17 Nov 2021 18:03:28 +0800</pubDate><description><![CDATA[1. 类型的作用域

声明在函数内部，是函数的本地值，类似private
声明在函数外部，是对当前包可见(包内所有.go文件都可见)的全局值，类似protect
声明在函数外部且首字母大写是所有包可见的全局值,类似public

2. 几种声明方式

var 声明变量，格式：var 变量名 变量类型
const 声明常量，格式：const identifier [type] = value，iota是Go中一个特殊常量，可以认为是一个可以被编译器修改的常量，iota是Go语言的常量计数器，只能在常量的表达式]]></description><category></category></item><item><title><![CDATA[Go-类型强转]]></title><link>https://blog.youkuaiyun.com/Mossil/article/details/121381568</link><guid>https://blog.youkuaiyun.com/Mossil/article/details/121381568</guid><author>Mossil</author><pubDate>Wed, 17 Nov 2021 17:32:49 +0800</pubDate><description><![CDATA[在Go语言中不存在隐式的类型转换，即自动转换，如PHP一样，但是在Go中所有的类型转换都必须显式的声明
格式：valueOfTypeB = typeB(valueOfTypeA)（类型 B 的值 = 类型 B(类型 A 的值))

var a int = 100
var b int8 = 100
c := a + int(b) // 正确写法
d := int8(a) + b // 正确写法
fmt.Println(c)
fmt.Println(d)
e := a + b // 错误写法
fmt.Prin.]]></description><category></category></item><item><title><![CDATA[Go-常见数据类型之字符与字符串]]></title><link>https://blog.youkuaiyun.com/Mossil/article/details/121379759</link><guid>https://blog.youkuaiyun.com/Mossil/article/details/121379759</guid><author>Mossil</author><pubDate>Wed, 17 Nov 2021 16:04:08 +0800</pubDate><description><![CDATA[1. 字符

Go语言中没有专门的字符类型，若存储单个字符(字母)一般使用byte类型来保存
字符只能使用单引号包裹，不能使用双引号，双引号包裹的是字符串

var s byte = 's'
fmt.Println(s) // 输出115
fmt.Printf("%c", s) // 输出s


以上案例说明：当我们直接输出byte值时，就是输出了对应字符的ASCII码值，若我们希望输出对应字符，需要使用格式化输出
Go语言的字符使用UTF-8编码，英文字母占一个字符，汉字占三个字符
Go语言的字符的本质是]]></description><category></category></item><item><title><![CDATA[Go-常见类型之浮点型]]></title><link>https://blog.youkuaiyun.com/Mossil/article/details/121379201</link><guid>https://blog.youkuaiyun.com/Mossil/article/details/121379201</guid><author>Mossil</author><pubDate>Wed, 17 Nov 2021 15:28:19 +0800</pubDate><description><![CDATA[类型
描述




floa32
32位浮点数


floa64
64位浮点数



浮点型在机器中的存放形式大致为：浮点数=符号位+指数位+尾数位，尾数位可能丢失造成精度损失，如下所示

var a float32 = 1.97897897356
var b float64 = 1.97897897356
fmt.Println(a)  // 1.978979
fmt.Println(b)  // 1.97897897356


以上案例说明float64的精度比float32的精度要高，所以当我...]]></description><category></category></item><item><title><![CDATA[Go-常见数据类型之整型]]></title><link>https://blog.youkuaiyun.com/Mossil/article/details/121377569</link><guid>https://blog.youkuaiyun.com/Mossil/article/details/121377569</guid><author>Mossil</author><pubDate>Wed, 17 Nov 2021 15:02:36 +0800</pubDate><description><![CDATA[在Go语言中变量分为有符号和无符号两种类型

有符号：int  int8  int16  int32  int64
无符号：unit  unit8 uint16 uint32  uint64
在保证程序正确运行的情况下，应该尽量选择占用空间小的数据类型，可以使用fmt.Printf("%T", var_name)输出变量类型，unsafe.Sizeof(var_name)查看变量占用字节





类型
描述
范围
实际范围




uint
32位或64位




uint8
无符号8位整型
0～2^8-]]></description><category></category></item><item><title><![CDATA[Go-初识]]></title><link>https://blog.youkuaiyun.com/Mossil/article/details/120996994</link><guid>https://blog.youkuaiyun.com/Mossil/article/details/120996994</guid><author>Mossil</author><pubDate>Wed, 27 Oct 2021 17:05:44 +0800</pubDate><description><![CDATA[1. Go语言的特点

自动立即回收
更丰富的内置类型
函数多返回值
错误处理
匿名函数和闭包
类型和接口
并发编程
反射
语言交互性

2. Go的安装
官方下载地址：https://golang.google.cn/dl/

Linux
A. 下载对应的二进制包
B. 将下载的二进制包解压至 /usr/local目录
C. 将 /usr/local/go/bin 目录添加至PATH环境变量
D. 使用go env命令查看是否安装成功

tar -C /usr/local -zxvf go1.17.2.l]]></description><category></category></item><item><title><![CDATA[Rabbitmq-return机制]]></title><link>https://blog.youkuaiyun.com/Mossil/article/details/118197092</link><guid>https://blog.youkuaiyun.com/Mossil/article/details/118197092</guid><author>Mossil</author><pubDate>Thu, 24 Jun 2021 21:49:58 +0800</pubDate><description><![CDATA[1. 概念
在某些情况下，当我们在发送消息时当前的exchange不存在或者指定的路由key路由不到，这个时候如果我们需要监听这种不可达的消息，就要使用Return Listener。Return Listener用于处理一些不可路由的消息。
2. 图解


...]]></description><category></category></item><item><title><![CDATA[Rabbitmq-幂等性]]></title><link>https://blog.youkuaiyun.com/Mossil/article/details/118196933</link><guid>https://blog.youkuaiyun.com/Mossil/article/details/118196933</guid><author>Mossil</author><pubDate>Thu, 24 Jun 2021 21:42:10 +0800</pubDate><description><![CDATA[1. 概念

用户对于同一操作发起的一次请求或者多次请求的结果是一致的，比如在mysql数据当中的乐观锁就可以用来保障幂等性。
在业务高峰期最容易产生消息重复消费问题，比如当消费者消费完消息时，在给生产者返回ack时由于网络中断，导致生产者未收到确认信息，该条消息就会重新发送并被消费者消费，但实际上该消费者已成功消费了该条消息，这就造成了重复消费。而幂等性，即消息不会被多次消费，即使我们收到了很多一样的消息。

2. 解决方案：唯一ID+指纹码

在消费者消费前先去数据库查询这条消息的指纹码标识是否存在，没]]></description><category></category></item><item><title><![CDATA[Rabbitmq-保证消息百分之百投递成功]]></title><link>https://blog.youkuaiyun.com/Mossil/article/details/118196148</link><guid>https://blog.youkuaiyun.com/Mossil/article/details/118196148</guid><author>Mossil</author><pubDate>Thu, 24 Jun 2021 21:27:30 +0800</pubDate><description><![CDATA[1. 生产者的可靠性投递

保证消息的成功发出
保证mq节点的成功接收
生产者收到mq节点确认应答
完善的消息补偿机制
注：在实际的生产环境中，很难保证前3点的完全可靠，如在极端的环境中，生产者发送消息失败了，生产者在接受确认应答时突然发送网络闪断等情况，所以很难保证可靠性投递，因此才需要完善的消息补偿机制。

2. 解决方案

消息信息落库，对消息状态进行打标签（常用方案）

消息的延迟投递，做二次确认，回调检查（不常用，大厂在用的高并发方案）



...]]></description><category></category></item><item><title><![CDATA[Rabbitmq-ACK机制]]></title><link>https://blog.youkuaiyun.com/Mossil/article/details/118185061</link><guid>https://blog.youkuaiyun.com/Mossil/article/details/118185061</guid><author>Mossil</author><pubDate>Thu, 24 Jun 2021 20:36:55 +0800</pubDate><description><![CDATA[1. 概念
生产者发送消息到消息队列，消息队列接受到消息后产生回送响应，生产者中有个Confirm Listener异步监听响应应答，所以ACK机制又叫comfirm机制。

生产者投递消息过后，如果消息队列接受到了则会给生产者一个应答
生产者接受应答，用来确认这条消息是否正常发送到了消息队列，这也是消息可靠性投递的核心保障。



...]]></description><category></category></item><item><title><![CDATA[Rabbitmq-PHP浅试]]></title><link>https://blog.youkuaiyun.com/Mossil/article/details/118178737</link><guid>https://blog.youkuaiyun.com/Mossil/article/details/118178737</guid><author>Mossil</author><pubDate>Thu, 24 Jun 2021 10:12:03 +0800</pubDate><description><![CDATA[&lt;?php

$config = [
    'host' =&gt; '172.17.0.7',
    'vhost' =&gt; 'my_vhost', // 虚拟机
    'port' =&gt; '5672',
    'login' =&gt; 'admin',
    'password' =&gt; 'admin'
];

$conn = new AMQPConnection($config);
if (!$conn-&gt;connect()) {
    exit('连接失败')]]></description><category></category></item><item><title><![CDATA[Rabbitmq-docker安装]]></title><link>https://blog.youkuaiyun.com/Mossil/article/details/118104234</link><guid>https://blog.youkuaiyun.com/Mossil/article/details/118104234</guid><author>Mossil</author><pubDate>Wed, 23 Jun 2021 16:48:05 +0800</pubDate><description><![CDATA[拉取镜像

docker pull rabbitmq


构建rabbitmq容器

docker run -p 5672:5672 -p 15672:15672 -d --name rabbitmq -v /docker/rabbitmq/:/var/lib/rabbitmq --privileged=true --hostname myRabbitmq -e RABBITMQ_DEFAULT_VHOST=my_vhost -e RABBITMQ_DEFAULT_USER=admin -e RABBIT.]]></description><category></category></item><item><title><![CDATA[Rabbitmq-初识]]></title><link>https://blog.youkuaiyun.com/Mossil/article/details/118102776</link><guid>https://blog.youkuaiyun.com/Mossil/article/details/118102776</guid><author>Mossil</author><pubDate>Tue, 22 Jun 2021 11:35:42 +0800</pubDate><description><![CDATA[1. rabbitmq的诞生及概念

消息队列的来源：
①、分布式系统已成为当前系统架构的主流，而消息队列在分布式系统中作为消息中间件能为分布式系统中的各种应用提供会话平台。
②、用多进程异步操作取代单进程同步操作满足了高性能系统架构需求。
③、可以防止服务器一下子做很多事情，消息队列采用队列的形式，消费者读取队列里面的消息的时候是一条一条读取的，服务器不会超负载。

2.消息队列的概念：
消息队列中间件是分布式系统中重要的组件，主要用于应用解耦、异步消息、流量削峰等问题。可实现高性能、高可用、可伸缩和最终]]></description><category></category></item></channel></rss>