[TOC]
1. 判斷一段程序是什么編譯器編譯
如果編譯器在編譯cpp文件,那么`_cplusplus`就會被定義,如果是一個C文件被編譯,那么`_STDC_`就會被定義,`_STDC_`是預定義宏,當它被定義后,編譯器將按照ANSIC標準來編譯C語言程序。
2. C++函數中值的傳遞方式
* 按值傳遞(pass by value)
* 地址傳遞(pass by pointer)
* 引用傳遞(pass by reference)
按值傳遞方式容易理解,但形參值的改變不能對實參產生影響。
` `
地址傳遞方式雖然可以使得形參的改變對相應的實參有效,但如果在函數中反復利用指針進行間接訪問,會使程序容易產生錯誤且難以閱讀。
` `
如果以引用為參數,則既可以使得對形參的任何操作都能改變相應的數據,又使得函數調用顯得方便、自然。引用傳遞方式是在函數定義時在形參前面加上引用運算符“&”。
3. C++中虛函數問題
4. C++和C有什么不同
語法
特性
場景
效率
C:面向過程,效率高,嵌入式。如linux核心大部分是C寫的
C++:面向對象。更上層,更復雜。增加里模版泛型。
5. C和C++中struct有什么區別
| | Protection行為 | 能否定義函數 |
| --- | --- | --- | --- |
| C | 無 | 否,但可以有函數指針 |
| C ++ | 有,默認是public | 可以 |
6. C++中struct和class有什么區別
區別在于權限問題上。
class和struct 做類型定義時只有兩點區別:
1)默認繼承權限。如果不明確指定,來自class的繼承按照private繼承處理,來自struct的繼承按照public繼承處理
2)成員的默認訪問權限。class的成員默認是private,struct默認是public權限。
7. int id[sizeof(unsigned long];這個對嗎?為什么?
正確
這個sizeof是編譯時運算符,編譯時就確定里可以看成和機器有關的變量。sizeof(unsigned long]) 確定的常量。
8. new in c++ is a: **key word** and **operator**
9. 變量的指針含意是指變量的**地址**
10. 多態的作用
- 1.隱藏實現細節,是的代碼能夠模塊化;擴展代碼模塊,實現代碼重用
- 2.接口重用:為了類在繼承和派生的時候,保證使用家族中任一類的實例的某一屬性時的正確調用。
11. 多態類中的虛函數表是Complie-Time,還是Run-Time時建立的?
虛函數表是在編譯時期就建立類,各個虛擬函數這時被組織成類一個虛擬函數的入口地址的數組,而對象的隱藏成員--虛擬函數表指針是在運行期--也就是構造函數被調用時進行初始化的,這是實現多態的關鍵。
12. 面向對象的三個基本特征,并簡單敘述之
封裝:將客觀事物抽象成類,每個類對自身的數據和方法是想protection(private,protected,public)
繼承:廣義的繼承有三種實現形式:實現繼承、可視繼承、接口繼承。前兩種和后一種構成類功能復用的兩種方式。
多態:是將父類對象設置成為和一個或更多的與他的自對象相等的技術,賦值之后,父對象就可以根據當前賦值給它的子對象的特征以不同的方式運作。簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針。
是什么?
怎么用?
為什么使用它?
13. 內聯函數在編譯時是否做參數類型檢查
內聯函數要做參數檢查,這his內聯函數跟宏相比的優勢。
14. 內存的分配方式有幾種
1) 靜態存儲區域。內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。例如全局變量。
2)在棧上創建。在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置于處理器的指令集中,效率很高,到那時分配的內存容量有限。
3)從堆上分配,亦稱動態內存分配。程序在運行的時候用malloc或new申請任意多少的內存,程序員自己負責在何時用free或delete釋放內存。動態內存的生存期由我們決定,使用非常靈活,但問題也最多。
15. 對于一個頻繁使用但短小函數,在C語言中應用什么實現,在C++中應用什么實現》
C用宏定義,C++用inline
16. 全局變量和局部變量有什么區別?是怎么實現的?操作系統和編譯器是怎么知道的?
生命周期:全局變量隨主程序創建而創建,隨主程序銷毀而銷毀;局部變量在局部函數內部,甚至局部循環體等內部存在,退出就不存在;
使用方式不同:通過聲明后全局變量程序的各個部分都可以用到,放在靜態數據區;局部變量只能在局部使用;分配在棧區。
操作系統和編譯器通過內存分配的位置來知道的,全局變量分配在全局數據段并且在程序開始運行的時候被加載。局部變量則分配在堆棧里。
17. 如果在申請動態內存時找不到足夠大的內存快,malloc和new將返回NULL指針,宣告內存申請失敗。你是怎么處理內存耗盡的?
如果返回nULL則什么都不做
18. 用C++寫一個程序,如何判斷一個操作系統是16位還是32位的?
標準答案:定義一個指針p。打印出sizeof(p),如果打印結果是4,則表示該操作系統是32位,打印結果是2,表示是16位。計算指針變量
19. 不用sizeof() 判斷操作系統是16位還是32位。
```
unsign int a = ~0;
if (a > 65536)
{
cout << "32 bit" << endl;
}
else
{
cout << "16 bit" << endl;
}
// 在64位操作系統中該方法不適合。需要用sizeof(指針)來計算
```
20. 為什么需要使用堆,使用堆空間的原因?
直到運行時才知道一個對象需要多少內存空間;不知道對象的生存周期到底有多長。
21. 若數組名作為實參而指針變量作形參,函數調用實參給形參的是()
數組第一個元素的地址
22. 有來malloc/free,為什么還要用new-delete
malloc/free是C++/C語言的標準庫函數,new/delete是C++的運算符。他們都可以用于申請動態內存和釋放內存。對于非內部數據類型的對象而言,光用malloc/free無法滿足動態對象的要求。對象在創建的同時要自動執行構造函數,對象在消亡之前要自動執行析構函數。由于malloc/free是庫函數而不是運算符,不在編譯器控制權限之內,不能把執行構造函數和析構函數的任務強加于malloc/free. 因此C++語言需要一個能完成動態內存分配和初始化工作的運算符new,以及一個能完成清理與釋放內存工作的運算符delete。注意new/delete不是庫函數。
23.為什么數組名作為參數,會改變數組的內容,而其他類型如int卻不會改變變量的值?
數組傳遞的是首元素的地址。
24。請講一講析構函數和虛函數的用法和作用
析構函數是特殊的類成員函數,它沒有返回類型,沒有參數,不能顯示調用,也沒有重載,只有在類對象的生命周期結束的時候,由系統自動調用。有釋放內存空間的作用。
可以是虛析構函數。
虛函數是C++多態的一種表現,使用虛函數,我們可以靈活的進行動態綁定,當然是以一定的開銷為代價。
25. 錯誤的轉義字符('091')
'\091' '\\' '\0' '\'
26. 如果ClassA中定義并實現虛函數int func(void), ClassB中也實現該函數,那么上述變量a->func()將調用哪個類里面的函數? 如果int func(void)不是虛函數,情況又如何?為什么?
第一問調用的是B的。第二問調用A的。虛函數的第一個典型應用。**虛函數只能借助于指針或者引用來達到多態的效果**。
27. 引用與指針有什么區別?
參考答案:
1)引用必須被初始化,指針不必
2)(引用初始化后不能被改變),指針可以改變所指的對象。
3)不存在只想空值的引用,但是存在指向空值的指針。
28. 你覺得如果不使用常量,直接在程序中填寫數字或字符串,將會有什么麻煩?
1)程序的可讀性變差。程序員自己會忘記那些數字或字符串是什么意思,用戶則更加不知他們從何而來、表示什么。
2)在程序的很多地方輸入同樣的數字或字符串,難保不發生書寫錯誤。
3)如果要修改數字或字符串,則會在很多地方改動,既麻煩又容易出錯。
29. 在C++中有沒有純虛構造函數?
構造函數不能是虛的,只有虛的析構函數。構造函數需要指定數據類型。
30. 重復多次fclose 一個打開過一次的FILE*fp指針會有什么結果,并請解釋。
考察點:導致文件描述符結構中指針指向的內存被重復釋放,進而導致一些不可預期的異常。
31.重載和重寫、重定義(覆蓋)的區別
重載:在同一個類中。是允許存在多個同名函數,而這些函數的參數表不同。
重寫:在繼承鏈中,派生類與基類函數同名,屏蔽基類的函數(虛函數)
覆蓋:不同名字空間,用于繼承,子類重新定義復類虛函數的方法
32. C++是不是類型安全的?
不是。兩個不同類型的指針之間可以強制轉換(用reinterpret cast).
33. C++里是不是所有的動作都是main()引起的?如果不是,請距離
比如全局變量的初始化,就不是由main函數引起的。
34. main函數執行之前,還會執行什么代碼》
全局對象的構造函數會在main函數之前執行
35. C++中virtual與inline的含義分別是什么?
在基類成員函數的聲明加上virtual關鍵字,意味著將該成員函數聲明為虛函數。inline與函數的定義體放在一起,使該函數稱為內聯。inline是一種用于實現的關鍵字,而不是用于聲明的關鍵字。
虛函數的特點;用于多態、純虛函數(抽象類)。如果希望派生類能夠重新定義基類的方法,則在基類中將該方法定義為虛方法,這樣可以啟動動態聯編。
內聯函數的特點;使用內聯函數的目的是為里提高函數的運行效率。內聯函數體的代碼不能過長,因為內聯函數省去調用函數的時間是以代碼膨脹為代價的。內聯函數不能包含循環語句,因為執行循環語句要比調用函數的開銷大。
36. const關鍵字?有哪些作用
1)欲阻止一個變量被改變,可以使用const關鍵字。在定義該const變量時,通常需要對它進行初始化,因為以后就沒有機會再去改變它里;
2)對指針來說,可以指定指針本身為const,也可以指定指針所指對數據為const,或二者同時指定為const;
3)在一個函數聲明中,const可以修飾形參,表明他是一個輸入參數,在函數內部不能改變其值;
4)對于類成員函數,若指定其為const類型,則表明其是一個常函數,不能修改類對成員變量;
5)對于類對成員函數,有時候必須指定其返回值為const類型,以使得其返回值不為“左值“。
37. VC中,編譯工具條內對Debug與Release選項是什么含義?
Debug:會額外新增一些可調式的符號。
Release:把運行不相關的信息剔除掉。發布版本
38. 是不是一個父類寫類一個virtual函數,如果子類覆蓋它的函數不加virtual,也能實現多態?
virtual修飾符會被隱形繼承。virtual可加可不加。子類的空間里有父類的所有變量(static除外)。同一個函數只存在一個實體(inline除外)。子類覆蓋它的函數不加virtual,也能實現多態。在子類的空間里,有父類的私有變量。私有變量不能直接訪問。
39. 一個棧的入棧序列是A,B,C,D,E,則棧的不可能的輸出順序是(DCEAB)。
棧:后進先出
40. 在不用第三方參數的情況下,交換兩個參數的值。
```
一:
a = a+b;
b = a - b;
a = a - b;
二:
異或:
```
41.打印當前源文件的文件名以及源文件的當前行號?
```
//使用預定義的兩個宏
cout << __FILE__;
cout << __LINE__;
```
42. 當一個類A中沒有聲明任何成員變量與成員函數,這時sizeof(A)的值為1
43. 下面的函數實現在一個固定的數上加上一個數,有什么錯誤。
```
int add_n(int n)
{
static int i = 100;
i += n;
return i;
}
解:因為static使得i的值會保留上次的值。以后的i會一直更新,使得第二次調用出現錯誤。去掉static就可以了。
```
44. 在排序方法中,關鍵碼比較次數與記錄地初始排列無關的是(D)
```
A.Shell排序 B.歸并排序 C.直接插入排序 D.選擇排序
```
45. 函數模版與類模版有什么區別?
函數模版的實例化是由編譯程序在處理函數調用時自動完成的,而類模版的實例化必須由程序員在程序中顯示的指定。
46、函數重載,我們靠什么來區分調用的那個函數?靠返回值判斷可以不可以?
```
不可以。
void Function(void);
int Function(void);
上述兩個函數,第一個沒有返回值,第二個的返回值是int類型。如果這樣調用函數:int x = Function();
則可以判斷除Function是第二個函數。問題是在C++/C程序中,我們可以忽略函數的返回值。在這種情況下,編譯器和程序員都不知道哪個Function函數被調用。所以只能靠參數而不能靠返回值類型的不同來區分重載函數。
```
47.不能被重載的運算符
1) 不能改變C++內部數據類型(如int,float等)運算符。
2)不能重載‘.‘,因為 在類中對任何成員都有意義,已經成為標準用法。
3)不能重載目前C++運算符集合中沒有的符號,如#,@,$等。原因有兩點,一是難以理解,二是難以確定優先級。
4)對已經存在的運算符進行重載時,不能改變優先級規則,否則將引起混亂。
48.基類的析構函數不是虛函數,會帶來什么問題?
```
class B: class A
{
}
A* a = new B();
delete a;
如果A的析構函數中不是虛函數。則在delete的時候只調用A的析構函數而不會調用B的析構函數。造成內存泄漏。
```
49. 介紹一下模版和容器。如何實現
模版是C++中實現泛型的一種機制
容器是一種特定用途的類
模版可以說比較古老類。但是當前的泛型編程實質上就是模版編程。它體現類了一種通用和泛化的思想
STL 有7種主要容器:
vector,list,deque, map, multimap, set, multiset.
50. 深拷貝和淺拷貝的區別
深拷貝:資源拷貝。意味著拷貝類資源和指針,
淺拷貝:只進行值拷貝。淺拷貝只是拷貝了指針,沒有拷貝資源。這樣使得兩個指針指向同一份資源,造成對同一份析構兩次,程序崩潰。臨時對象的開銷比局部對象小些
- Unity3D
- Unity3D學習路線
- U3D基礎
- UGUI
- 數據結構和算法
- 算法時間復雜度
- 二叉樹
- B樹 & B+樹
- 紅黑樹
- 跳躍表
- Lecod算法題目
- C++-排序算法
- sort排序
- 冒泡排序
- 選擇排序
- 插入排序
- 快速排序
- 希爾排序
- 堆排序
- 歸并排序
- 遞歸算法
- LSMs和B tree
- mysql引擎
- 匯編程序
- 匯編入門 Hello World
- 匯編語言整數加減法
- 寄存器的使用和說明
- 匯編語言常用知識點
- 匯編語言中的幾個偽指令
- 匯編語言數據類型以及數據定義
- 匯編語言計算數組和字符串長度
- 匯編語言中寄存器加[]的意思
- 匯編語言中$符號的用法
- 匯編語言系統調用(System Calls)
- 匯編語言push和pop指令
- 匯編語言尋址操作
- 匯編語言進階
- GNUx86-64匯編
- C/C++調用匯編函數
- 用匯編理解C函數的調用過程和返回值
- 從匯編的角度看C++
- C/C++
- C++-編程入門
- C/C++環境搭建
- JsonCPP的使用
- 連接數據庫
- 連接mysql
- connector
- C API
- 連接sqlite3
- 使用sqlite3步驟
- 使用Clion
- thread-多線程
- 初識thread
- detach陷阱
- 事實
- 陷阱總結
- 剪切板操作
- 剪切板基本操作
- 剪切板詳細api
- 文件操作
- 桌面右鍵菜單批處理
- Resource Hacker
- 獲取指定輸入法
- 學習網站
- C++11中的匿名函數(lambda函數,lambda表達式)
- sleep和usleep的區別
- 使用std::unique_ptr 管理 FILE 指針
- typedef的用法
- strtuct中的char*和char數組
- 各個平臺不同類型占用字節數
- C++進階
- C++淺拷貝和深拷貝的區別
- C++類型強制轉換
- C++11寫的定時器
- C調用java函數
- C++11 特性
- 二進制兼容
- GDB的基礎命令
- GDB調試死鎖
- 核心底層代碼
- 線程池的實現
- 線程池的應用場景
- C++協程庫
- C++定時器原理
- 通信協議
- Socket5協議
- https 協議
- TCP-擁塞控制
- C++-STL
- map/unordered_map/hash_map區別
- 初始化vector
- STL算法
- Effective STL
- 條款5:盡量使用區間成員函數代替它們的單元素兄弟
- 條款9:在刪除選項中仔細選擇
- 條款13:盡量使用vector和string來代替動態分配的數組
- 條款14:使用reserve來避免不必要的重新分配
- 條款16: 如何將vector和string的數據傳給遺留的API
- 條款17:使用“交換技巧”來修整過剩容量
- 條款18:避免使用vector<bool>
- 條款30:確保目標區間足夠大
- 編輯器
- VS Code
- 配置C++
- 命令行編譯
- CMake
- CMake 升級
- cmake-基本操作
- 設置入口
- 修改vs運行時庫
- CMake生成sln
- CMake設置輸出目錄
- CMake添加GDB調試
- 使靜態庫和動態庫同時存在
- C/C++網絡編程
- 網絡基礎
- 5種網絡IO模型總結
- 條件變量
- 設置阻塞socket超時時間
- ccnet
- 一個reactor單線程庫
- ccnet從單線程轉變為多線程
- IO多路復用
- IO多路復用的理解
- EPOLL
- select示例代碼
- epoll 示例代碼
- iocp示例代碼
- muduo庫
- muduo編譯
- Libevent的簡單使用
- 編譯libevent
- Libevent幾個簡單的api
- Libevent 定時器
- Libevent通用的編程技法
- Libevent簡單的Server/Client
- Boost庫學習
- Boost庫編譯
- 利用Boost 實現線程池
- boost::asio
- boost::mutex
- Boost解析Json
- Boost.Asio的一些想法
- win32t網絡編程
- 簡單的c/s socket通信
- 回響
- 迭代服務器跟客戶端
- 進行類創建
- socket文件傳輸
- 簡單的udp
- Reactor模型與Proactor模型
- Actor和CSP模型
- 大量的timewait
- EPOLL的bug
- C++-界面
- MFC
- mfc小知識
- MFC呂鑫
- 初識mfc
- 初始化
- 消息映射
- 組合鍵 與(&)運算
- WIN32+MFC自定義消息
- 對話框的相關消息
- DestroyWindow
- GDI
- 初窺
- 坐標
- 創建畫筆
- CDC
- CPaintDC
- CPen
- CBursh
- CFont
- CBitmap
- LoadImage
- CMemDC
- 自適應
- 雙緩沖問題
- 閃爍問題
- 小型軟件開發
- 記事本
- 圖形架構軟件
- 提綱圖形
- 操作
- 重載關閉按鈕
- 自定義消息
- 自繪按鈕
- 自繪基礎知識
- 自繪按鈕提綱
- 步驟
- 自會下拉列表
- 自繪下拉列表
- 自繪菜單欄
- MFC函數類
- SetTimer
- 高級控件應用
- 高級控件開發提綱
- 菜單欄
- 網絡通信協議
- 提綱
- sizeof====strlen
- 堆 == 棧
- Socket
- 基本代碼
- UDP協議
- Win32
- 窗口操作
- 創建窗口,自定義按鈕
- 給按鈕加背景圖
- 給窗口加背景
- 貼圖
- DLL組件創建
- HOOK鉤子
- MinGW
- duilib
- 地址
- 屬性列表
- 第一個duilib項目
- DUI自帶的完整
- ListControl
- TreeView
- 重設窗口大小
- 計算DPI
- HandleMessage跟MessageHandle
- CEF
- cef環境搭建
- cefsimple簡單流程
- 優化CEF
- P2P
- stun搭建
- QT5
- QT5環境安裝
- QT信號與槽的概念
- QT工程CMakeLists.txt文件的編寫
- QT32位
- libShadowQT
- GoflywayQT
- 計劃
- Protocol Buffer
- ProtoBuf安裝
- 包管理器
- vcpkg
- conan
- xmake
- C++面試總結
- 基礎
- 分布式鎖
- C++重載、覆蓋與多態性
- 20道必須掌握道C++面試題
- 傳值、傳地址、傳引用總結
- 50道面試題 (1)
- 50道面試題 (2)
- 內聯函數的作用以及使用限制
- vector的resize用法
- 虛函數/虛表/虛基類
- 公司面試
- 面試:簡單算法題目
- 面試:GetMemory
- 2021-3/11號面試記錄(lihe)
- leetcode
- leetcode331-驗證二叉樹的前序序列化
- leetcode141. 環形鏈表
- C/C++程序員面試秘籍
- 鏈表
- 使用C/C++實現atoi和itoa函數
- mysql面試題
- 協程解析
- 協程解析一(ucontext解析)
- 協程解析二(云風的coroutine)
- 進程、線程、協程
- 自己制作一個協程庫
- C語言中兩個指針間的運算
- Windows中一些宏的含義
- C++書籍在線觀看
- 安裝TeamTalk
- Lua和C/C++互相調用
- android環境配置
- TCP/IP
- 三次握手四次揮手
- 有限狀態機
- 游戲開發
- UE4
- 開發一個fps的游戲
- 環境安裝,讓人物跑起來
- 增加血條和護甲
- 再生盔甲和傷害功能
- 最后一戰
- 最后一戰安裝部署
- 登錄流程 LS & BS & CS
- 最后一戰-游戲場景服務器SS
- 降臨
- 降臨安裝部署
- skynet
- skynet安裝部署
- lua-protobuc庫--skynet使用自定義protobuf
- pbc庫--skynet使用自定義protobuf
- 掃雷
- 仙劍奇俠傳
- 爐石傳說
- unity環境搭建
- 尋路算法
- 音視頻
- WebRTC
- webrtc源碼下載
- webrtc 編譯
- gn和ninja文件作用
- webrtc 源碼目錄結構
- WebRTC實時互動入門
- web 服務
- nodejs 搭建http服務
- nodejs 搭建https服務
- webrtc 獲取音視頻設備
- webrtc 音視頻采集
- webrtc 音視頻約束
- webrtc 瀏覽器視頻特效
- webrtc 從視頻中獲取圖片
- webrtc 只采集音頻數據
- webrtc MediaStream和獲取視頻約束
- webrtc 媒體流的錄制
- webrtc 捕獲桌面
- webrtc 信令服務器
- webrtc 傳輸基本知識
- webrtc NAT
- webrtc ICE
- webrtc 媒體能力協商
- webrtc 端到端鏈接的基本流程
- webrtc SDP
- webrtc STUN/TURN
- webrtc 客戶端信令消息
- webrtc 視頻通話實現
- webrtc 傳輸速率控制
- webrtc 統計信息
- webrtc IOS
- Kamailio
- webrtc的分析
- Webrtc音視頻會議之Mesh/MCU/SFU三種架構
- RTSP / RTP / RTCP協議
- RTMP / RTSP / WebRTC之間的關系
- webrtc源碼
- PeerConnection解析
- FFmpeg
- FFmpeg命令行的使用
- ffmpeg命令語法
- FFmpeg設備采集
- FFmpeg生成水印
- FFmpeg畫中畫和視頻多宮格
- FFmpeg定時截圖
- FFmpeg基本概念
- FFmpeg基本模塊
- ffmpeg 濾鏡處理
- ffmpeg流的指定
- FFmpeg相關api
- 基本函數
- 打印音視頻信息
- 抽取音視頻數據
- 捕捉攝像頭并推流
- FFmpeg拉流截圖
- vs2017編譯錯誤
- 自定義跨平臺FFmpeg播放器
- ffmpeg拉流并且使用qt
- ffmpeg讀取攝像頭并且推流
- ASS和SRT字幕有何區別
- 解決ffmpeg 在avformat_find_stream_info執行時間太長
- sws_getContext()處理AV_PIX_FMT_NONE 幀格式引起的core dump
- OWT系列
- owt-server
- owt-server 編譯運行
- owt-server模塊
- owt-client-javascript解析
- owt-client-android
- owt-android編譯運行
- owt-client-android系列分析
- owt-conference
- Licode
- licode安裝
- licode 系列
- basic example client
- basic example server
- 音視頻基礎概念
- 視頻播放中的碼率的概念
- 幀率
- nginx-rtmp 模塊搭建與使用
- RTMP分析
- RTMP規范
- RTMP流媒體播放過程
- 一段簡單的CMakeLists.txt
- Go
- Go Base
- Go 環境安裝
- mod
- Go 流程控制
- interface convert to string/int/float64
- Go mod拉取私有倉庫
- VSCode配置go環境
- Go 設置代理
- Viper讀取配置文件
- vim打造成go的ide
- Go 交叉編譯
- GO 簡單功能
- Golang發起http請求
- Go 定時任務
- websocket協議
- Golang的定時器
- JWT認證
- Google Protobuf 請求參數為空的案例
- Go文件下載
- Go 服務熱更新方案
- Go 靜態服務器
- gocolly的使用
- golang中獲取字符串長度的幾種方法
- hugo搭建靜態博客
- go利用reids實現分布式鎖
- Go 代理
- Go 簡單http代理
- Go SS代理流程
- Go AES加密和解密的三種模式實現(CBC/ECB/CFB)
- Go 負載均衡
- Go 標準庫
- reflect.Type和reflect.Value
- container & list & ring & heap
- Context
- http 請求
- Go base64
- Go struct <=> json
- Go切片合并
- Go 包的使用
- pprof包的使用
- Go Grpc
- ymal 配置文件
- 日志包 logrus / zap
- Go 命令行多指令操作
- Cobra/viper 命令行解析
- Go sync/atomic
- zap日志
- Go 進階
- Go sync.Mutex詳解
- 使用自定義頭和protobuf解決沾包問題
- 使用 build tag 來自定義構建配置
- 使用valgrind檢測程序是否內存泄露
- Go參數傳遞是值傳遞還是引用傳遞
- Go 切片/數組
- Channel的使用
- Go Interface詳解
- GO-IM系統
- IM架構
- Go搭建一個http服務器
- mattermost-server
- matter編譯部署
- mattermost配置
- matter詳解
- Goim
- Centrifugo
- Tinode
- cgo入門
- GO語言中使用C語言
- reflect.StringHeader和reflect.SliceHeader
- Cgo使用libevent庫實現一個定時器
- cgo遍歷C結構體數組
- Go和C之間的類型轉換
- Elasticsearch
- Elasticsearch安裝
- etcd的使用
- etcd 安裝
- Docker
- Docker 安裝部署
- 修改Docker鏡像源
- 使用Dockerfile構建部署項目
- 使用Dockerfile多階段構建
- Dockerfile指令解析
- Volume
- 創建一個images
- Docker容器管理
- Shipyard
- Portainer
- lazydocker-docker 終端ui管理
- Docker 容器-ssh登錄
- Dockerfile CMD啟動命令
- Docker 容器獨立ip
- 清理 Docker文件
- Docker-Composer
- Docker遠程訪問
- Docker 遠程訪問API設置
- Docker 結合IDEA使用
- Docker 使用錯誤
- Docker鏡像瘦身
- Docker查看退出碼 exitCode
- Docker安裝寶塔
- Docker創建calibre-web
- Docker不能使用gdb調試的解決方案
- k8s
- K8s安裝部署
- 安裝部署coreDNS
- web管理之一 Dashboard
- dashboard的yaml文件
- 集群監控 heapster
- 資源監控 metrics
- web管理之二 Prometheus
- idea k8s插件
- 第一個 k8s應用
- k8s將pod在master上運行
- k8s網絡通信模型
- Deployment和Pod區別
- Statefulset的基本使用
- k8s的持久化存儲 PersistentVolume
- Ingress基本用法
- k8s錯誤處理
- 角色權限
- busybox k8s的調試工具
- nfs的安裝和使用
- Kafka
- kafka介紹
- Redis
- Redis的安裝
- Redis主從配置
- Redis數據類型
- Redis-Set
- Redis-Hash
- Redis設計與實現
- 第一節:sds
- 第二節:鏈表的實現
- 第三節:字典的實現(一) - 基本原理
- 第四節:字典的實現(二) - 哈希算法
- 第五節:字典的實現(三) - 哈希沖突解決方案
- 第六節:字典的實現(四) - rehash原理
- 第七節:跳躍表
- 第七節:整數集合
- 第八節:壓縮列表
- 第九節:對象
- 總結
- Redis源碼分析
- 配置VScode調試Redis源碼
- VScode調試Redis源碼,指針顯示的問題
- Redis模塊概述
- Redis的五個數據類型
- sds字符串分析
- adlist分析
- ziplist壓縮列表
- quicklist
- dict字典--hashtable
- zskiplist-跳躍表
- sparkline微線圖
- Redis源碼的一些基礎知識總結
- 在redis中遇見redisObject struct
- acl庫編寫Redis客戶端
- hireids操作
- 當內存耗盡時,redis怎么做
- 如何保證redis的高并發及高可用?
- 使用redis實現分布式鎖
- Redis管道技術測試
- MongoDB
- MongoDB安裝
- MongoDB免安裝版
- Mongodb C Driver驅動安裝
- MongoDB知識點
- MongoDB基礎
- MongodB原子操作
- MongoDB索引
- MongoDB主從/副本集
- MongoDB分片集群
- MongoDB性能檢測
- MongoDB構建模式
- Mongo-cxx-driver
- mongo-c-driver
- MongoDB用戶操作
- MySQL
- MySQL安裝
- 一個機器多個MySQL
- 創建遠程鏈接
- 字段編輯
- 存儲過程
- MySQL嚴格模式
- Mysql 丟失Root密碼
- 中國全省市表
- 高性能MySQL
- MySQL并發控制
- MySQL基準測試
- MySQL服務器性能剖析
- MySQLSchema與數據類型優化
- MySQL創建高性能索引
- MySQL復制
- MySQL-高可用
- MySQL引擎
- DB
- Oracle
- ORACLE9i安裝
- Oracle存儲過程
- Oracle 存儲過程基礎組件
- Oracle存儲過程示例
- Other Language
- Python
- python編程通用概念
- python安裝
- pycharm-docker調試
- Python安裝AES加密
- python安裝pip
- 錯誤
- py框架
- Django
- 開始一個項目
- 路由
- 模型層
- 創建博客文章模型
- Django Shell
- 初識Django Admin模塊
- 實現博客數據返回頁面
- 初始Django視圖與模板
- boot靜態頁面
- django分頁
- Django設置
- djangocms
- 語言特性
- 切片
- PHP
- php外部擴展
- 添加C擴展
- 添加外部C擴展
- 添加redis
- redis
- 下載
- 封裝
- 外部訪問配置
- redis基本操作
- 框架
- TP5
- Model
- 自動寫入時間戳
- Laravel
- 安裝
- TP3.2
- CACHE緩存
- create
- curl
- 文件下載
- 模塊名字
- 常用工具
- 功能代碼
- 檢測磁盤剩余空間
- 靜態類
- 消除html標簽
- 檢測手機號
- 毫秒 == 日期格式
- jQuery
- 找子元素
- php網絡編程
- socket
- socket_server.php
- socket_client.php
- websocket
- websocket_server.php
- websocket_client.html
- websocket_unit.js
- swoole
- 環境依賴及安裝
- 搭環境
- windows搭建apache+php7
- nginx做成服務順便配置php
- Lua
- Lua環境安裝
- lua api
- lua_pop & lua_settop
- lua_next
- JAVA
- Java通用編程概念
- Java環境安裝
- 編譯遇到的問題
- 請求接口
- java變量類型
- Android
- IDEA 配置 gradle
- Rust
- Rust編程通用概念
- Rust安裝
- 更換crates源
- 寫一個hello world
- 變量可變性
- 數據類型
- Struct+方法語法
- 賦值
- tokio網絡框架
- tokio安裝
- EchoServer
- 實現Future
- 組合器
- shadowsocket-rust
- shadowsocket-rust安裝
- Scheme
- 環境搭建及基本語法
- JavaScript
- NodeJs
- React
- React-Native
- 使用pkg打包
- Nginx
- Nginx-反向代理
- OpenResty初探
- OpenResty做一個postman
- lua沒有continue
- nginx 配置靜態服務器
- 將luarocks整合進openresty,并安裝lfs
- Git
- GitHub基本操作
- Github跟本地的配置和操作
- GitHub搜索
- Github鏡像
- git修改遠程倉庫
- Git基本操作
- 安裝gitlab
- VC工程的.gitignore
- Git 設置代理
- Git克隆部分文件
- Linux
- 用戶操作
- 防火墻操作
- 壓縮
- Linux時間同步
- CURL
- Linux samba文件共享
- 使用cat創建新文件并追加內容
- htop / glances / dstat
- IPC錯誤
- nc的使用
- 核與線程 CPU 4核8線程 的解釋
- Linux 使用 MLDonkey 下載 ed2k
- Linux技巧
- LINUX技巧-查找文件行中值重復的行
- tcpdump 抓包
- 日志查找
- nethogs 查看網絡流量
- 系統中加入庫目錄
- 將root權限的文件改為用戶權限
- linux 打開文件數 too many open files 解決方法
- 查看系統CPU/GPU/磁盤io
- 快速刪除大量文件的方法
- Linux-文件傳輸
- 安裝 nvidia 驅動
- 改造VIM
- 通過vimplus項目一鍵配置vim
- 自定義vim配置C++IDE
- 終端配色
- VIM+項目管理
- vimplus快捷鍵
- 自動切換輸入法
- Shell編程
- shell腳本守護進程
- if [ $# -eq 0 ]該語句是什么含義?
- 從命令行提示輸入,和自動輸入,自動交互
- grep指令
- cut指令
- awk指令
- xargs
- 使用except自動交互
- Ubuntu
- 界面安裝
- 更換源
- Ubuntu安裝docker
- Ubuntu18 安裝qt
- 更新密鑰
- Ubuntu開啟遠程登錄
- Ubuntu16.04界面無法啟動
- apt-get install 沒有自動安裝
- dpkg: 處理軟件包 nginx (--configure)時出錯
- ubuntu下瀏覽器使用代理
- Ubuntu把放大縮小按鈕移動到左邊
- wine 安裝錯誤
- Ubuntu下安裝Microsoft to do
- 在Ubuntu上使用ssh連接另外一臺機器出問題
- 解決windows和ubuntu16.04虛擬機拖放問題
- 解決apt-get /var/lib/dpkg/lock-frontend 問題
- Ubuntu安裝cinnamon
- sudo apt-get update錯誤
- googlechrome
- Ubuntu16.04安裝xmind
- Ubuntu下載迅雷
- Linux護眼寶
- 查看Ubuntu安裝的界面
- 使用aria2
- CentOS7使用yum安裝gcc
- System
- MAC
- 安裝軟件
- mac基本操作
- 安裝pod
- 改造終端
- VIM配置
- Chroom瀏覽器https訪問
- mac攝像頭打不開
- Mac與Windows或Linux的鍵鼠共享神器Synergy
- Windows
- 小工具
- bat文件的使用
- bat把exe文件做成單擊右鍵可運行的
- copy
- 注冊 dll
- 鏡像==分區
- choco
- BaiduPCS-go
- tail日志查看命令
- 右鍵菜單沒有選項
- Proxy SwitchyOmega
- Google云服務器配置
- 百度網盤不限速
- 遠程桌面
- 百度地圖離線開發
- 查看端口
- SC命令使用
- 開發
- TIME_WAIT過多導致服務不能被訪問
- 修改win的默認編碼
- 百度網盤二維碼刷新不出來
- 移動端
- Object-C
- 錄音跟播放
- 視頻的采集跟播放
- Swift
- Swift編程通用概念
- Switf環境安裝
- Swift Package Manager(SPM)
- 手動導入庫
- PerfectTemplate的使用
- PerfectTemplate環境搭建
- ios直播開發
- Simple-RTMP-Server
- Mac上安裝ffmpeg環境
- 推流拉流
- 仿直播app開發
- 框架搭建
- 開發流程
- React-Native
- React-native環境安裝
- 分布式追蹤系統
- Jaeger 客戶端庫
- LightStep 的使用
- 軟件
- PhpStorm
- 安裝ThinkStrom
- 添加xdebug
- Clion
- C++開發配置
- 激活碼
- 在linux上制作桌面圖標
- Vagrant
- VMWare
- VirtualBox
- proxifier + Shadowshocks
- Cmder
- Navicate For MongoDB
- MinDoc
- GitHub速度慢
- 科學
- VMware虛擬機磁盤操作占用過高問題
- PhotoShop+Premiere下載
- ActionView安裝部署
- 讀書筆記
- 博客
- hexo
- 部署
- jekyll
- 在線編譯器
- 書屋
- 如何閱讀一本書
- 個人發展
- Linux高性能服務器讀書筆記
- TCP/IP協議族
- IP協議
- TCP協議詳解
- TCP協議的擁塞控制
- 安全測試
- 常見web安全漏洞
- 程序設計
- log日志設計
- 爬蟲項目
- Python3.7的安裝
- Scrapy的安裝和使用
- Colly框架
- Crawlab是一款款里爬蟲的web框架
- 英文學習