-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
310 lines (227 loc) · 32.4 KB
/
Copy pathindex.html
File metadata and controls
310 lines (227 loc) · 32.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
<!DOCTYPE html><html lang="zh-CN" data-theme="light"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"><title>Hugmeok - 常公征的博客</title><meta name="keywords" content="Hugmeok"><meta name="author" content="AlexC"><meta name="copyright" content="AlexC"><meta name="format-detection" content="telephone=no"><meta name="theme-color" content="#ffffff"><meta name="description" content="元亨,利涉大川">
<meta property="og:type" content="website">
<meta property="og:title" content="Hugmeok">
<meta property="og:url" content="https://github.com/Awadabang/Awadabang.github.io/index.html">
<meta property="og:site_name" content="Hugmeok">
<meta property="og:description" content="元亨,利涉大川">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="http://cdn.hugmeok.top/myblog/xing.jpg">
<meta property="article:author" content="AlexC">
<meta property="article:tag" content="Hugmeok">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="http://cdn.hugmeok.top/myblog/xing.jpg"><link rel="shortcut icon" href="/img/favicon.png"><link rel="canonical" href="https://github.com/Awadabang/Awadabang.github.io/"><link rel="preconnect" href="//cdn.jsdelivr.net"/><link rel="preconnect" href="//busuanzi.ibruce.info"/><link rel="stylesheet" href="/css/index.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free/css/all.min.css" media="print" onload="this.media='all'"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/ui/dist/fancybox.css" media="print" onload="this.media='all'"><script>const GLOBAL_CONFIG = {
root: '/',
algolia: undefined,
localSearch: undefined,
translate: undefined,
noticeOutdate: undefined,
highlight: {"plugin":"highlighjs","highlightCopy":true,"highlightLang":true,"highlightHeightLimit":false},
copy: {
success: '复制成功',
error: '复制错误',
noSupport: '浏览器不支持'
},
relativeDate: {
homepage: false,
post: false
},
runtime: '',
date_suffix: {
just: '刚刚',
min: '分钟前',
hour: '小时前',
day: '天前',
month: '个月前'
},
copyright: undefined,
lightbox: 'fancybox',
Snackbar: undefined,
source: {
justifiedGallery: {
js: 'https://cdn.jsdelivr.net/npm/flickr-justified-gallery@2/dist/fjGallery.min.js',
css: 'https://cdn.jsdelivr.net/npm/flickr-justified-gallery@2/dist/fjGallery.min.css'
}
},
isPhotoFigcaption: false,
islazyload: false,
isAnchor: false
}</script><script id="config-diff">var GLOBAL_CONFIG_SITE = {
title: 'Hugmeok',
isPost: false,
isHome: true,
isHighlightShrink: false,
isToc: false,
postUpdate: '2022-03-29 12:57:26'
}</script><noscript><style type="text/css">
#nav {
opacity: 1
}
.justified-gallery img {
opacity: 1
}
#recent-posts time,
#post-meta time {
display: inline !important
}
</style></noscript><script>(win=>{
win.saveToLocal = {
set: function setWithExpiry(key, value, ttl) {
if (ttl === 0) return
const now = new Date()
const expiryDay = ttl * 86400000
const item = {
value: value,
expiry: now.getTime() + expiryDay,
}
localStorage.setItem(key, JSON.stringify(item))
},
get: function getWithExpiry(key) {
const itemStr = localStorage.getItem(key)
if (!itemStr) {
return undefined
}
const item = JSON.parse(itemStr)
const now = new Date()
if (now.getTime() > item.expiry) {
localStorage.removeItem(key)
return undefined
}
return item.value
}
}
win.getScript = url => new Promise((resolve, reject) => {
const script = document.createElement('script')
script.src = url
script.async = true
script.onerror = reject
script.onload = script.onreadystatechange = function() {
const loadState = this.readyState
if (loadState && loadState !== 'loaded' && loadState !== 'complete') return
script.onload = script.onreadystatechange = null
resolve()
}
document.head.appendChild(script)
})
win.activateDarkMode = function () {
document.documentElement.setAttribute('data-theme', 'dark')
if (document.querySelector('meta[name="theme-color"]') !== null) {
document.querySelector('meta[name="theme-color"]').setAttribute('content', '#0d0d0d')
}
}
win.activateLightMode = function () {
document.documentElement.setAttribute('data-theme', 'light')
if (document.querySelector('meta[name="theme-color"]') !== null) {
document.querySelector('meta[name="theme-color"]').setAttribute('content', '#ffffff')
}
}
const t = saveToLocal.get('theme')
if (t === 'dark') activateDarkMode()
else if (t === 'light') activateLightMode()
const asideStatus = saveToLocal.get('aside-status')
if (asideStatus !== undefined) {
if (asideStatus === 'hide') {
document.documentElement.classList.add('hide-aside')
} else {
document.documentElement.classList.remove('hide-aside')
}
}
const detectApple = () => {
if(/iPad|iPhone|iPod|Macintosh/.test(navigator.userAgent)){
document.documentElement.classList.add('apple')
}
}
detectApple()
})(window)</script><meta name="generator" content="Hexo 5.4.0"></head><body><div id="sidebar"><div id="menu-mask"></div><div id="sidebar-menus"><div class="avatar-img is-center"><img src="http://cdn.hugmeok.top/myblog/xing.jpg" onerror="onerror=null;src='/img/friend_404.gif'" alt="avatar"/></div><div class="site-data is-center"><div class="data-item"><a href="/archives/"><div class="headline">文章</div><div class="length-num">42</div></a></div><div class="data-item"><a href="/tags/"><div class="headline">标签</div><div class="length-num">5</div></a></div><div class="data-item"><a href="/categories/"><div class="headline">分类</div><div class="length-num">0</div></a></div></div><hr/><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 首页</span></a></div><div class="menus_item"><a class="site-page" href="/archives/"><i class="fa-fw fas fa-archive"></i><span> 时间轴</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 分类</span></a></div><div class="menus_item"><a class="site-page group" href="javascript:void(0);"><i class="fa-fw fas fa-list"></i><span> 清单</span><i class="fas fa-chevron-down"></i></a><ul class="menus_item_child"><li><a class="site-page child" href="/music/"><i class="fa-fw fas fa-music"></i><span> 音乐</span></a></li><li><a class="site-page child" href="/movies/"><i class="fa-fw fas fa-video"></i><span> 电影</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="/message_board/"><i class="fa-fw fa fa-paper-plane"></i><span> 留言板</span></a></div><div class="menus_item"><a class="site-page" href="/link/"><i class="fa-fw fas fa-link"></i><span> 友链</span></a></div><div class="menus_item"><a class="site-page" href="/about/"><i class="fa-fw fas fa-heart"></i><span> 关于</span></a></div></div></div></div><div class="page" id="body-wrap"><header class="full_page" id="page-header" style="background-image: url('http://cdn.hugmeok.top/myblog/mountains.jpg')"><nav id="nav"><span id="blog_name"><a id="site-name" href="/">Hugmeok</a></span><div id="menus"><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 首页</span></a></div><div class="menus_item"><a class="site-page" href="/archives/"><i class="fa-fw fas fa-archive"></i><span> 时间轴</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 分类</span></a></div><div class="menus_item"><a class="site-page group" href="javascript:void(0);"><i class="fa-fw fas fa-list"></i><span> 清单</span><i class="fas fa-chevron-down"></i></a><ul class="menus_item_child"><li><a class="site-page child" href="/music/"><i class="fa-fw fas fa-music"></i><span> 音乐</span></a></li><li><a class="site-page child" href="/movies/"><i class="fa-fw fas fa-video"></i><span> 电影</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="/message_board/"><i class="fa-fw fa fa-paper-plane"></i><span> 留言板</span></a></div><div class="menus_item"><a class="site-page" href="/link/"><i class="fa-fw fas fa-link"></i><span> 友链</span></a></div><div class="menus_item"><a class="site-page" href="/about/"><i class="fa-fw fas fa-heart"></i><span> 关于</span></a></div></div><div id="toggle-menu"><a class="site-page"><i class="fas fa-bars fa-fw"></i></a></div></div></nav><div id="site-info"><h1 id="site-title">Hugmeok</h1><div id="site_social_icons"><a class="social-icon" href="https://github.com/Awadabang" target="_blank" title="Github"><i class="fab fa-github"></i></a><a class="social-icon" href="mailto:1765256254@gqq.com" target="_blank" title="Email"><i class="fas fa-envelope"></i></a></div></div><div id="scroll-down"><i class="fas fa-angle-down scroll-down-effects"></i></div></header><main class="layout" id="content-inner"><div class="recent-posts" id="recent-posts"><div class="recent-post-item"><div class="post_cover left"><a href="/2022/03/28/Golang%20%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/" title="Golang 设计模式"><img class="post_bg" src="http://cdn.hugmeok.top/myblog/wave.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Golang 设计模式"></a></div><div class="recent-post-info"><a class="article-title" href="/2022/03/28/Golang%20%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/" title="Golang 设计模式">Golang 设计模式</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2022-03-27T17:12:21.000Z" title="发表于 2022-03-28 01:12:21">2022-03-28</time></span></div><div class="content">1. 工厂设计模式
创建一个工厂类负责实例化对象,就像汽车制造厂来生成汽车一样。工厂负责创建产品,客户端访问工厂类实例化具体产品
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253package mainimport "fmt"type Fruit interface { grant() pick()}type Apple struct { name string}type Orange struct { name string}func (*Apple) grant() { fmt.Println("种植苹果")}func (*Apple) pick() { fmt.Println("采摘苹果")}func (*Orange) grant() { fmt.Println(& ...</div></div></div><div class="recent-post-item"><div class="post_cover right"><a href="/2022/03/25/Golang%20Interface/" title="Golang Interface"><img class="post_bg" src="http://cdn.hugmeok.top/myblog/wave.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Golang Interface"></a></div><div class="recent-post-info"><a class="article-title" href="/2022/03/25/Golang%20Interface/" title="Golang Interface">Golang Interface</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2022-03-25T13:25:21.000Z" title="发表于 2022-03-25 21:25:21">2022-03-25</time></span></div><div class="content"></div></div></div><div class="recent-post-item"><div class="post_cover left"><a href="/2022/03/24/Golang%20GMP/" title="Golang GMP"><img class="post_bg" src="http://cdn.hugmeok.top/myblog/wave.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Golang GMP"></a></div><div class="recent-post-info"><a class="article-title" href="/2022/03/24/Golang%20GMP/" title="Golang GMP">Golang GMP</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2022-03-23T17:34:21.000Z" title="发表于 2022-03-24 01:34:21">2022-03-24</time></span></div><div class="content">1.进程、线程、协程
进程:一个进程就是CPU执行的单个任务的过程,是程序在执行过程当中CPU资源分配的最小单位,并且进程都有自己的地址空间,包含了运行态、就绪态、阻塞态、创建态、终止态五个状态。
线程:线程是CPU调度的最小单位,它可以和属于同一个进程的其他线程共享这个进程的全部资源
协程:协程是更轻量级用户态线程的实现
Golang对协程的处理:将goroutine内存将为几KB,可以大量生成goroutine;支持灵活调度,可以经常切换
2.GMP模型
G:Goroutine协程
P:Processor处理器,包含了G的资源
M:内核线程
P的数量是通过runtime.GOMAXPROCS()来设置的,默认是CPU核心数
M的数量是限制最大10000,通过debug.SetMaxThreads(n),可以调整。有一个M阻塞,会创建一个新的M,如果一个M空闲,会回收或睡眠。
全局队列:存放等待运行的G
本地队列:存放等待运行的G,不超过256个G,优先将G放在本地队列中
3.调度器设计策略
复用线程:避免频繁创建、销毁线程,而是对线程的复用
work st ...</div></div></div><div class="recent-post-item"><div class="post_cover right"><a href="/2022/03/23/Golang%20sync/" title="Golang sync"><img class="post_bg" src="http://cdn.hugmeok.top/myblog/wave.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Golang sync"></a></div><div class="recent-post-info"><a class="article-title" href="/2022/03/23/Golang%20sync/" title="Golang sync">Golang sync</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2022-03-23T09:29:21.000Z" title="发表于 2022-03-23 17:29:21">2022-03-23</time></span></div><div class="content">
sync包提供了:
Mutex:互斥锁
RWMutex:读写锁
WaitGroup:等待组
Once:单次执行
Cond:信号量
Pool:临时对象池
Map:自带锁的map
1.互斥锁Mutex在解决 Data Race(数据竞争)的问题上,Mutex 已经走到了终点。只要正确的使用 Mutex,就能避免高并发
但是面对高频的读——写场景,Mutex 并不是一个很好的选择,海量的读都会被阻塞。
1234type Mutex struct { state int32 // 当前互斥锁的状态 sema uint32 // 用于控制锁状态的信号量}
2.读写锁RWMutexGo 中 RWMutex 使用的是写优先的设计。写优先是指如果有写进程在等待锁,会阻止后来的读进程获得锁(当然也会阻塞写进程)。写优先保证的是新来的进程,这样就避免了写饥饿的问题。
RWMutex 中的5个方法:
Lock/Unlock: 写操作锁。如果锁被读进程或者写进程持有,Lock 会一直阻塞,直到获取到锁;Unlock 是对应的解锁操作。
RLock/RUnlock: 读操 ...</div></div></div><div class="recent-post-item"><div class="post_cover left"><a href="/2022/03/23/Golang%20GC/" title="Golang GC"><img class="post_bg" src="http://cdn.hugmeok.top/myblog/wave.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Golang GC"></a></div><div class="recent-post-info"><a class="article-title" href="/2022/03/23/Golang%20GC/" title="Golang GC">Golang GC</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2022-03-23T08:29:21.000Z" title="发表于 2022-03-23 16:29:21">2022-03-23</time></span></div><div class="content">
从进程虚拟地址空间来看
代码段:程序要执行的指令在代码段
数据段:全局变量、静态数据在数据段
栈:函数的局部变量、参数、返回值放在函数栈帧
堆:不能确定大小的对象、生命周期超出所在函数的对象放在堆上
直接分配在栈上的数据会随着函数调用栈的销毁释放自身占用的内存
分配在堆上的数据要程序主动释放
“悬挂指针问题”:堆上的数据释放早了,后续对该数据的访问出错
“内存泄漏问题”:堆上的数据一直不释放
根节点:栈、数据段
1.标记清除法
缺点:
STW:让程序暂停
标记需要扫描整个heap
清除数据会产生heap碎片
2.三色标记法
全部节点标记为白色
把与根节点相连的节点标记为灰色
遍历灰色标记表,相连的白色标记标为灰色,遍历过的灰色标记为黑色
重复上一步,直到灰色标记表中无节点
删除白色垃圾
3.强弱三色不变式
强三色不变式:不允许黑色对象引用白色对象
弱三色不变式:黑色可以引用白色,同时此白色的链路上游有灰色对象
三色标记中满足强弱之一,可保证对象不丢失
4.屏障机制
插入写屏障:对象被引用时触发的机制:在A引用B时,B被标记为灰色
为了节省栈的效率,栈 ...</div></div></div><div class="recent-post-item"><div class="post_cover right"><a href="/2022/03/23/Golang%20String/" title="Golang String"><img class="post_bg" src="http://cdn.hugmeok.top/myblog/wave.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Golang String"></a></div><div class="recent-post-info"><a class="article-title" href="/2022/03/23/Golang%20String/" title="Golang String">Golang String</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2022-03-23T05:34:21.000Z" title="发表于 2022-03-23 13:34:21">2022-03-23</time></span></div><div class="content">1.数据结构1234type stringStruct struct { str unsafe.Pointer // 指向byte数组 len int}
2.String与[]byte转换
标准转换
123456// string to []bytes1 := "hello"b := []byte(s1)// []byte to strings2 := string(b)
强转换
12345678910111213func String2Bytes(s string) []byte { sh := (*reflect.StringHeader)(unsafe.Pointer(&s)) bh := reflect.SliceHeader{ Data: sh.Data, Len: sh.Len, Cap: sh.Len, } return *(*[]byte)(unsafe.Pointer(&bh))& ...</div></div></div><div class="recent-post-item"><div class="post_cover left"><a href="/2022/03/23/Golang%20Struct/" title="Golang Struct"><img class="post_bg" src="http://cdn.hugmeok.top/myblog/wave.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Golang Struct"></a></div><div class="recent-post-info"><a class="article-title" href="/2022/03/23/Golang%20Struct/" title="Golang Struct">Golang Struct</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2022-03-23T05:29:21.000Z" title="发表于 2022-03-23 13:29:21">2022-03-23</time></span></div><div class="content">1. 空结构体
空结构体struct{}实例不占据任何的内存空间
2.空结构体的作用
实现集合(Set)
12// 集合只用map的键不需要值type Set map[string]struct{}
不发送数据的信道(channel)
12// channel 不需要发送任何的数据,只用来通知子协程执行任务,或只用来控制协程并发度ch := make(chan struct{})
仅包含方法的结构体
12345type Door struct{}func (d Door) Open() { fmt.Println("Open the door")}
无论是 int 还是 bool 都会浪费额外的内存,因此呢,这种情况下,声明为空结构体是最合适的。
3.结构体比较同一个struct的两个实例可比较也不可比较,当结构不包含不可直接比较成员变量(slice、map、Function)时可直接比较,否则不可直接比较
对含有不可直接比较的数据类型的结构体实例进行比较时,可以借 ...</div></div></div><div class="recent-post-item"><div class="post_cover right"><a href="/2022/03/23/Golang%20%E8%B0%83%E8%AF%95%E4%B8%8E%E6%80%A7%E8%83%BD%E5%88%86%E6%9E%90/" title="Golang 调试与性能分析"><img class="post_bg" src="http://cdn.hugmeok.top/myblog/wave.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Golang 调试与性能分析"></a></div><div class="recent-post-info"><a class="article-title" href="/2022/03/23/Golang%20%E8%B0%83%E8%AF%95%E4%B8%8E%E6%80%A7%E8%83%BD%E5%88%86%E6%9E%90/" title="Golang 调试与性能分析">Golang 调试与性能分析</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2022-03-23T04:59:21.000Z" title="发表于 2022-03-23 12:59:21">2022-03-23</time></span></div><div class="content">1.分析程序的运行时间与CPU利用率
shell内置time指令
123456$ time go run test2.go &{{0 0} 张三 0}real 0m0.843suser 0m0.216ssys 0m0.389s
real:从程序开始到结束,实际度过的时间;
user:程序在用户态度过的时间;
sys:程序在内核态度过的时间。
一般情况下 real>=user + sys,因为系统还有其它进程(切换其他进程中间对于本进程会有空白期)。
/usr/bin/time -v指令
12345678910111213141516171819202122232425$ /usr/bin/time -v go run test2.go Command being timed: "go run test2.go" User time (seconds): 0.12 System time (seconds): 0.06 Percent of CPU this job got: 115% Elap ...</div></div></div><div class="recent-post-item"><div class="post_cover left"><a href="/2022/03/23/Golang%20%E5%87%BD%E6%95%B0%E8%B0%83%E7%94%A8/" title="Golang 函数调用"><img class="post_bg" src="http://cdn.hugmeok.top/myblog/wave.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Golang 函数调用"></a></div><div class="recent-post-info"><a class="article-title" href="/2022/03/23/Golang%20%E5%87%BD%E6%95%B0%E8%B0%83%E7%94%A8/" title="Golang 函数调用">Golang 函数调用</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2022-03-22T17:48:21.000Z" title="发表于 2022-03-23 01:48:21">2022-03-23</time></span></div><div class="content">1.传参方式
传值:函数调用时会对参数进行拷贝,被调用方和调用方两者持有不相关的两份数据;
传引用:函数调用时会传递参数的指针,被调用方和调用方两者持有相同的数据,任意一方做出的修改都会影响另一方。
Go 语言选择了传值的方式,无论是传递基本类型、结构体还是指针,都会对传递的参数进行拷贝
2.slice作为参数slice在函数传参时,传的是底层的数组指针
12345678910111213func myfunc(arg []int) { arg = append(arg, 2) fmt.Printf("p:%v len:%d cap :%d\n", arg, len(arg), cap(arg))}func main() { p := make([]int, 0) p = append(p, 1) myfunc(p) fmt.Printf("p:%v len:%d cap :%d", p, len(p), cap(p))}//p:[1 2] len:2 cap :2//p:[1] len:1 ca ...</div></div></div><div class="recent-post-item"><div class="post_cover right"><a href="/2022/03/23/Golang%20Channel/" title="Golang Channel"><img class="post_bg" src="http://cdn.hugmeok.top/myblog/wave.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Golang Channel"></a></div><div class="recent-post-info"><a class="article-title" href="/2022/03/23/Golang%20Channel/" title="Golang Channel">Golang Channel</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2022-03-22T16:41:21.000Z" title="发表于 2022-03-23 00:41:21">2022-03-23</time></span></div><div class="content">1.数据结构12345678910111213type hchan struct { qcount uint // 缓冲区元素个数 dataqsiz uint // 缓冲区最多元素个数 buf unsafe.Pointer // 缓冲区数组指针 elemsize uint16 // 缓冲区每个元素大小 closed uint32 // channel的关闭状态 elemtype *_type // 元素的类型元数据 sendx uint // 缓冲区写下标 recvx uint // 缓冲区读下标 recvq waitq // 发送队列 sendq waitq // 接收队列 lock mutex // 锁}
2.设计原理Go 语言中最常见的、也是经常被人提及的设计模式就是:不要通过共享内存的方式进行通信,而是应该通过通信的方式共享内存。
Go语言中线程(协程)通信方法:
共享内存+互斥锁
通信方式 ...</div></div></div><nav id="pagination"><div class="pagination"><span class="page-number current">1</span><a class="page-number" href="/page/2/#content-inner">2</a><span class="space">…</span><a class="page-number" href="/page/5/#content-inner">5</a><a class="extend next" rel="next" href="/page/2/#content-inner"><i class="fas fa-chevron-right fa-fw"></i></a></div></nav></div><div class="aside-content" id="aside-content"><div class="card-widget card-info"><div class="is-center"><div class="avatar-img"><img src="http://cdn.hugmeok.top/myblog/xing.jpg" onerror="this.onerror=null;this.src='/img/friend_404.gif'" alt="avatar"/></div><div class="author-info__name">AlexC</div><div class="author-info__description">元亨,利涉大川</div></div><div class="card-info-data is-center"><div class="card-info-data-item"><a href="/archives/"><div class="headline">文章</div><div class="length-num">42</div></a></div><div class="card-info-data-item"><a href="/tags/"><div class="headline">标签</div><div class="length-num">5</div></a></div><div class="card-info-data-item"><a href="/categories/"><div class="headline">分类</div><div class="length-num">0</div></a></div></div><a id="card-info-btn" href="https://github.com/xxxxxx"><i class="fab fa-github"></i><span>Follow Me</span></a><div class="card-info-social-icons is-center"><a class="social-icon" href="https://github.com/Awadabang" target="_blank" title="Github"><i class="fab fa-github"></i></a><a class="social-icon" href="mailto:1765256254@gqq.com" target="_blank" title="Email"><i class="fas fa-envelope"></i></a></div></div><div class="card-widget card-announcement"><div class="item-headline"><i class="fas fa-bullhorn card-announcement-animation"></i><span>公告</span></div><div class="announcement_content">This is my Blog</div></div><div class="sticky_layout"><div class="card-widget card-recent-post"><div class="item-headline"><i class="fas fa-history"></i><span>最新文章</span></div><div class="aside-list"><div class="aside-list-item"><a class="thumbnail" href="/2022/03/28/Golang%20%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/" title="Golang 设计模式"><img src="http://cdn.hugmeok.top/myblog/wave.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Golang 设计模式"/></a><div class="content"><a class="title" href="/2022/03/28/Golang%20%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/" title="Golang 设计模式">Golang 设计模式</a><time datetime="2022-03-27T17:12:21.000Z" title="发表于 2022-03-28 01:12:21">2022-03-28</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/2022/03/25/Golang%20Interface/" title="Golang Interface"><img src="http://cdn.hugmeok.top/myblog/wave.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Golang Interface"/></a><div class="content"><a class="title" href="/2022/03/25/Golang%20Interface/" title="Golang Interface">Golang Interface</a><time datetime="2022-03-25T13:25:21.000Z" title="发表于 2022-03-25 21:25:21">2022-03-25</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/2022/03/24/Golang%20GMP/" title="Golang GMP"><img src="http://cdn.hugmeok.top/myblog/wave.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Golang GMP"/></a><div class="content"><a class="title" href="/2022/03/24/Golang%20GMP/" title="Golang GMP">Golang GMP</a><time datetime="2022-03-23T17:34:21.000Z" title="发表于 2022-03-24 01:34:21">2022-03-24</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/2022/03/23/Golang%20sync/" title="Golang sync"><img src="http://cdn.hugmeok.top/myblog/wave.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Golang sync"/></a><div class="content"><a class="title" href="/2022/03/23/Golang%20sync/" title="Golang sync">Golang sync</a><time datetime="2022-03-23T09:29:21.000Z" title="发表于 2022-03-23 17:29:21">2022-03-23</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/2022/03/23/Golang%20GC/" title="Golang GC"><img src="http://cdn.hugmeok.top/myblog/wave.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Golang GC"/></a><div class="content"><a class="title" href="/2022/03/23/Golang%20GC/" title="Golang GC">Golang GC</a><time datetime="2022-03-23T08:29:21.000Z" title="发表于 2022-03-23 16:29:21">2022-03-23</time></div></div></div></div><div class="card-widget card-tags"><div class="item-headline"><i class="fas fa-tags"></i><span>标签</span></div><div class="card-tag-cloud"><a href="/tags/Computer-Network/" style="font-size: 1.3em; color: #99a1ac">Computer Network</a> <a href="/tags/Golang/" style="font-size: 1.5em; color: #99a9bf">Golang</a> <a href="/tags/SQL/" style="font-size: 1.5em; color: #99a9bf">SQL</a> <a href="/tags/Scrapy/" style="font-size: 1.3em; color: #99a1ac">Scrapy</a> <a href="/tags/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/" style="font-size: 1.1em; color: #999">微信小程序</a></div></div><div class="card-widget card-archives"><div class="item-headline"><i class="fas fa-archive"></i><span>归档</span></div><ul class="card-archive-list"><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2022/03/"><span class="card-archive-list-date">三月 2022</span><span class="card-archive-list-count">38</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2022/02/"><span class="card-archive-list-date">二月 2022</span><span class="card-archive-list-count">3</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2021/08/"><span class="card-archive-list-date">八月 2021</span><span class="card-archive-list-count">1</span></a></li></ul></div><div class="card-widget card-webinfo"><div class="item-headline"><i class="fas fa-chart-line"></i><span>网站资讯</span></div><div class="webinfo"><div class="webinfo-item"><div class="item-name">文章数目 :</div><div class="item-count">42</div></div><div class="webinfo-item"><div class="item-name">本站访客数 :</div><div class="item-count" id="busuanzi_value_site_uv"></div></div><div class="webinfo-item"><div class="item-name">本站总访问量 :</div><div class="item-count" id="busuanzi_value_site_pv"></div></div><div class="webinfo-item"><div class="item-name">最后更新时间 :</div><div class="item-count" id="last-push-date" data-lastPushDate="2022-03-29T04:57:25.850Z"></div></div></div></div></div></div></main><footer id="footer"><div id="footer-wrap"><div class="copyright">©2020 - 2022 By AlexC</div><div class="framework-info"><span>框架 </span><a target="_blank" rel="noopener" href="https://hexo.io">Hexo</a><span class="footer-separator">|</span><span>主题 </span><a href="https://github.com/jerryc127/hexo-theme-butterfly">Butterfly</a></div><div class="icp"><a target="_blank" rel="noopener" href="http://www.beian.miit.gov.cn/"><span>鲁ICP备2021005893号-1</span></a></div><div class="icp"><a target="_blank" rel="noopener" href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=37018102000658"><img class="icp-icon" src="/img/%E5%A4%87%E6%A1%88%E5%9B%BE%E6%A0%87.png"/><span>鲁公网安备 37018102000658号</span></a></div></div></footer></div><div id="rightside"><div id="rightside-config-hide"><button id="darkmode" type="button" title="浅色和深色模式转换"><i class="fas fa-adjust"></i></button><button id="hide-aside-btn" type="button" title="单栏和双栏切换"><i class="fas fa-arrows-alt-h"></i></button></div><div id="rightside-config-show"><button id="rightside_config" type="button" title="设置"><i class="fas fa-cog fa-spin"></i></button><button id="go-up" type="button" title="回到顶部"><i class="fas fa-arrow-up"></i></button></div></div><div><script src="/js/utils.js"></script><script src="/js/main.js"></script><script src="https://cdn.jsdelivr.net/npm/@fancyapps/ui/dist/fancybox.umd.js"></script><div class="js-pjax"></div><script async data-pjax src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script></div></body></html>