- linux操作系統(tǒng)_2014-04-16_1
- linux操作系統(tǒng)_2014-04-16_2
- linux操作系統(tǒng)_2014-04-16_3
- Video_2014-03-29_193638遞歸
- Video_2014-03-29_xiawu
- Video_2014-03-29_上午
- Video_2014-03-31_165832數(shù)組
- Video_2014-03-31_函數(shù)
- Video_2014-04-01_120548二分查找以及外掛
- Video_2014-04-01_165511指針
- Video_2014-04-01_172728總結
- Video_2014-04-01_二維數(shù)組
- Video_2014-04-03_170255動態(tài)
- Video_2014-04-03_指針
- Video_數(shù)組指針
- Video_2014-04-07_145027
- Video_2014-04-08_104158上午字符串輸出
- Video_2014-04-08_120209上午字符串
- Video_2014-04-08_151454
- Video_2014-04-08_164346
- Video_2014-04-09_165651
- Video_2014-04-09_183504
- Video_2014-04-09_200356
- 01-就業(yè)班接口封裝和設計思想引導及初步實踐-王保明
- 02-就業(yè)班cc++課程總體安排
- 03-就業(yè)班學員要求及小結
- 04-排序熱身及數(shù)組做函數(shù)參數(shù)退化為指針引申
- 05-數(shù)據(jù)類型本質(zhì)及變量本質(zhì)分析-王保明
- 06-中午課程總結8
- 07-程序內(nèi)存四區(qū)和函數(shù)調(diào)用模型-王保明
- 08-內(nèi)存四區(qū)深入理解-王保明
- 09-鐵律1指針也是一種數(shù)據(jù)類型-王保明
- 10-工程開發(fā)中指針初步-易犯模型
- 01-day01復習及不斷修改指針變量含義場景建立
- 02-間接賦值成立的三個條件-王保明
- 03-間接賦值是指針存在的最大意義場景-現(xiàn)實意義-王保明
- 05-中午課程總結
- 06-函數(shù)原型使用思路及自寫copy函數(shù)技術推演
- 07-項目開發(fā)中字符串操作模型積累1
- 08-實戰(zhàn)練習
- 09考試題
- 01-字符串開發(fā)-兩頭堵模型建立
- 02-字符串開發(fā)-反轉模型建立
- 03-工程開發(fā)中字符串操作易犯錯誤模型
- 04-keyvalude作業(yè)項目開發(fā)寫法展示
- 05-作業(yè)點評
- 06-const專題講座
- 關鍵字作業(yè)意思描述
- 07-初識二級指針第一種內(nèi)存模型
- 08-初識第二種內(nèi)存模型
- 09-初識第三種內(nèi)存模型
- 10-兩個輔助指針變量挖字符
- 01-考試題2
- 02-學生作業(yè)點評
- 03-數(shù)組類型基礎及數(shù)組指針基礎-王保明
- 04-數(shù)組指針用法
- 05-多維數(shù)組本質(zhì)-王保明
- 06-多維數(shù)組做函數(shù)參數(shù)推演-王保明
- 07-二級指針輸入三種內(nèi)存模型圖-王保明
- 08-指針數(shù)組案例講解-王保明
- 01-課 程復習
- 02-怎么區(qū)分指針數(shù)組和數(shù)組指針
- 03-野指針問題拋出
- 04-避免野指針方法-王保明
- 05-結構體操作的基礎
- 06-結構變量copy行為研究初步
- 07-結構做函數(shù)參數(shù)
- 08-結構體操作01
- 08-指針變量和它所指向的內(nèi)存空間是兩個不同的概念-王保明
- 09-項目開發(fā)一級指針要點-王保明
- 11-項目開發(fā)-二級指針要點-王保明
- 12-深copy和淺copy
- 01-結構體復習
- 02-點評作業(yè)
- 03文件讀寫基本api01
- 04-按照行讀寫
- 05-freadfwrite
- 06-配置文件接口封裝和設計思想引導
- 01-考試題
- 02-考試及課堂點評-二級指針做輸入學習標準
- 03-二級指針易犯錯誤模型深入剖析
- 04-二級指針輸出模型建立-王保明
- 04-一級指針內(nèi)存模型分析-王保明
- 05-二級指針易犯錯誤模型-王保明
- 06-玩轉多級指針-王保明
- 07-動態(tài)庫調(diào)用流程演示
- 08-多級指針入棧出棧分析
- 09-動態(tài)庫開發(fā)環(huán)境搭建
- 10-動態(tài)庫核心源碼編寫-王保明
- 11-動態(tài)庫設計和實現(xiàn)-加日志-王保明
- 12-作業(yè)
- 13-第二套動態(tài)庫api
- 01-文件專題復習
- 02-動態(tài)庫
- 03-多級指針是重點
- 04-結構體鏈表基礎
- 05-鏈表操作-創(chuàng)建遍歷
- 06-鏈表操作-刪除和插入-王保明
- 07-鏈表基本操作代碼優(yōu)化
- 08-鏈表逆置操作-王保明
- 09-結構體高級話題
- 10-linux內(nèi)核鏈表了解
- 12-linux內(nèi)核鏈表補充
- 01-c語言框架總結
- 02-學生作品點評
- 03-cplusplus和c語言的關系
- 04-類和對象的hello例子
- 05-hello易犯錯誤模型-王保明
- 06-namespace點
- 07-namespace和iostream
- 08-register關鍵字功能增強
- 09-全局變量cplusplus不同
- 10-struct類型加強
- 11-cplusplus類型檢測增強
- 12-bool類型補充
- 12-bool類型注意點
- 01-課程復習及課堂紀要
- 02-引用專題講座2
- 03-const引用
- 04-函數(shù)加強
- 05-cplusplus授課路線
- 07_面向過程編程到面向?qū)ο缶幊逃柧?
- 08_面向過程編程到面向?qū)ο缶幊逃柧?
- 09_面向?qū)ο缶幊蘡pp和h分離
- 10_對象初始化及有參構造函數(shù)
- 01_考試試題01
- 02_考試試題2
- 03_考試試題0304
- 04_copy構造函數(shù)場景3
- 05_copy構造函數(shù)場景4-王保明
- 06_深copy淺copy-王保明
- 07-有關匿名對象的補充說明-王保明
- 08-深copy淺copy中的copy構造和=函數(shù)的區(qū)別
- 09-構造函數(shù)初始化列表
- 10-臨時對象深入理解-王保明
- 12-new和delete專題講座
- 13-static專題
- 01-構造析構課程重要點復習
- 02-成員函數(shù)和全局函數(shù)pk-王保明
- 03-鏈表貨物類
- 04-友元函數(shù)友元類
- 05-操作符重載技術入門推演
- 06-操作符重載的兩種方法1
- 07-全局函數(shù)friend應用場景鏈式編程
- 08-數(shù)組類操作符重載環(huán)境說明
- 09-第一個函數(shù)提示
- 10-【】操作符重載講解-王保明
- 11-第二個函數(shù)代碼講解-王保明
- 12-第三個第四個函數(shù)重載代碼講解
- 13-cocos2d-x源碼
- 進程控制_2014-05-28_1
- 進程控制_2014-05-28_2
- 進程控制_2014-05-28_3
- 進程控制_2014-05-28_4
- 進程控制_2014-05-28_5
- 01-操作符重載知識點及作業(yè)點評
- 02-子類繼承三種方式
- 03-friend友元函數(shù)申明和應用易錯點
- 04-繼承中的重名和static
- 05-繼承中的構造和析構基礎
- 06-繼承中的混搭風-王保明
- 07-extern修飾全局變量常用套路
- 08-static靜態(tài)變量分配內(nèi)存
- 08-static靜態(tài)變量分配內(nèi)存補充
- 09-多繼承二義性及虛繼承解決方法
- 10-多態(tài)基礎01
- 11-多態(tài)案例-王保明
- 12-多態(tài)的工程意義及多態(tài)成立的三個條件-王保明
- 01-課程復習
- 02-重載與重寫-王保明
- 03-多態(tài)理解面試題層次應答-王保明
- 04-c++編譯器多態(tài)的實現(xiàn)探究-王保明
- 05-父類構造函數(shù)中能產(chǎn)生多態(tài)嗎1
- 05-父類構造函數(shù)中能產(chǎn)生多態(tài)嗎2-原理解釋-王保明
- 06-子類對象和父類指針混搭-王保明
- 07-為什么需要虛析構函數(shù)-王保明
- 08-中午課程總結
- 09-抽象類語法基礎
- 10-接口類在多繼承中的應用-王保明
- 11-cplusplus中接口的封裝和設計和模塊界面分工(軟件架構初步)
- 12-cplusplus接口類模型框架搭建-王保明
- 01-上層課程復習
- 02-函數(shù)指針語法基礎-王保明
- 03-函數(shù)指針正向調(diào)用-王保明
- 04-動態(tài)庫回調(diào)函數(shù)概念理解
- 05-socket動態(tài)庫開發(fā)環(huán)境搭建1
- 06-socket動態(tài)庫回調(diào)函數(shù)開發(fā)01-王保明
- 07-socket動態(tài)庫回調(diào)函數(shù)開發(fā)02-王保明
- 08-socket動態(tài)庫回調(diào)函數(shù)第二種寫法-王保明
- 09-泛型編程語法基礎
- 10-泛型編程強化
- 11-函數(shù)模板遇上函數(shù)重載
- 12-函數(shù)模板實現(xiàn)本質(zhì)探究-王保明
- 01-上一次課程復習
- 02-stl基本概念
- 03-stl的vector入門
- 04-stl的stack入門
- 05-stl的queue入門
- 06-stl鏈表入門-迭代器用法展示
- 07-stl算法回調(diào)基礎
- 扯淡1
- Video_2014-05-14_095643
- Video_2014-05-14_105847
- 07-企業(yè)級財富庫線性表-順序存儲開發(fā)和設計01-王保明
- 08-企業(yè)級財富庫線性表-順序存儲開發(fā)和設計02-王保明
- 01-上次課程復習
- 02-企業(yè)級財富庫-線性表設計與實現(xiàn)-王保明
- 03-線性表順序存儲和鏈式存儲優(yōu)缺點比較
- 04-企業(yè)級財富庫-循環(huán)鏈表的入門和使用
- 05-企業(yè)級財富庫-循環(huán)鏈表代碼分析-王保明
- 06-企業(yè)級財富庫-循環(huán)鏈表代碼分析補充
- 07-企業(yè)級財富庫-雙向鏈表-測試應用
- 08-企業(yè)級財富庫-雙向鏈表代碼講解-王保明
- 09-企業(yè)級財富庫-seqstack設計與實現(xiàn)01-王保明
- 10-企業(yè)級財富庫-seqstack設計與實現(xiàn)02-王保明
- 11-企業(yè)級財富庫-seqstack設計與實現(xiàn)03-王保明
- 12-企業(yè)級財富庫-linkstack設計與實現(xiàn)01-王保明
- 01-上 一次課程復習
- 02-棧的應用思路及代碼分析
- 03-企業(yè)級財富庫-隊列順序存儲設計與實現(xiàn)-王保明
- 04-企業(yè)級財富庫-隊列鏈式存儲設計與實現(xiàn)-王保明
- 05-樹的基本概念及二叉樹的基本概念
- 06-二叉樹性質(zhì)-
- 07-二叉樹遍歷基礎
- 08-二叉樹遍歷編程基礎
- 09-二叉樹copy
- 10-二叉樹非遞歸算法-王保明
- 11-二叉樹非遞歸算法2-王保明
- 01-上次 課程復習
- 02-根據(jù)先序遍歷和中序遍歷來建樹
- 03-根據(jù)通過先序遍歷+空格建樹
- 04-生成線索化樹算法講解
- 05-中序線索化化二叉樹代碼講解
- 06-霍夫曼樹
- 07-排序基本概念
- 08-選擇排序法
- 09-插入法
- 10-冒泡
- 11-快速排序
- 12-快速排序思想
- 13-補充
- linux操作系統(tǒng)_2014-04-16_1
- linux操作系統(tǒng)_2014-04-16_2
- linux操作系統(tǒng)_2014-04-16_3
- linux操作系統(tǒng)_2014-05-23_1
- linux操作系統(tǒng)_2014-05-23_2
- linux開發(fā)環(huán)境_2014-05-25_1
- linux內(nèi)存管理_2014-05-25_1
- linux文件管理_2014-05-25_1
- linux文件管理_2014-05-25_2
- linux文件管理_2014-05-25_3
- linux文件管理_2014-05-26_1
- linux文件管理_2014-05-26_2
- linux文件管理_2014-05-26_3
- linux文件管理_2014-05-26_4
- linux文件管理_2014-05-26_5
- linux文件管理_2014-05-26_6
- 進程間通信_2014-05-29_1
- 進程間通信_2014-05-29_2
- 進程控制_2014-05-28_1
- 進程控制_2014-05-28_2
- 進程控制_2014-05-28_3
- 進程控制_2014-05-28_4
- 進程控制_2014-05-28_5
- 進程控制_2014-05-29_1
- 多線程_2014-05-31_1
- 多線程_2014-05-31_2
- 多線程_2014-05-31_3
- 01-構造析構課程重要點復習
- 02-成員函數(shù)和全局函數(shù)pk-王保明
- 03-鏈表貨物類
- 04-友元函數(shù)友元類
- 05-操作符重載技術入門推演
- 06-操作符重載的兩種方法1
- 07-全局函數(shù)friend應用場景鏈式編程
- 08-數(shù)組類操作符重載環(huán)境說明
- 09-第一個函數(shù)提示
- 10-【】操作符重載講解-王保明
- 11-第二個函數(shù)代碼講解-王保明
- 12-第三個第四個函數(shù)重載代碼講解
- 13-cocos2d-x源碼
- qq習題講座
- QT編程_2014-06-5_1
- QT編程_2014-06-5_2
- QT編程_2014-06-5_3
- QT編程_2014-06-5_4
- QT編程_2014-06-5_5
- 數(shù)據(jù)庫編程_2014-06-9_1
- 數(shù)據(jù)庫編程_2014-06-9_2
- 數(shù)據(jù)庫編程_2014-06-9_3
- 數(shù)據(jù)庫編程_2014-06-9_4
- 數(shù)據(jù)庫編程_2014-06-9_5
- 數(shù)據(jù)庫編程_2014-06-9_6
- 數(shù)據(jù)庫編程_2014-06-9_7
- 數(shù)據(jù)庫編程_2014-06-9_8
- 數(shù)據(jù)庫編程_2014-06-9_9
- 數(shù)據(jù)庫編程_2014-06-9_10
- 數(shù)據(jù)庫編程_2014-06-9_11
- 數(shù)據(jù)庫編程_2014-06-9_12
- 數(shù)據(jù)庫編程_2014-06-9_13
- 數(shù)據(jù)庫編程_2014-06-9_14
- 數(shù)據(jù)庫編程_2014-06-9_15
- 項目實戰(zhàn)CDMA基站管理_2014-06-12_1
- 項目實戰(zhàn)CDMA基站管理_2014-06-12_2
- 項目實戰(zhàn)CDMA基站管理_2014-06-12_3
- 項目實戰(zhàn)CDMA基站管理_2014-06-12_4
- 項目實戰(zhàn)CDMA基站管理_2014-06-12_5
- 項目實戰(zhàn)CDMA基站管理_2014-06-12_6
- 項目實戰(zhàn)CDMA基站管理_2014-06-12_7
- 項目實戰(zhàn)CDMA基站管理_2014-06-12_8
- 項目實戰(zhàn)CDMA基站管理_2014-06-12_9
- 項目實戰(zhàn)CDMA基站管理_2014-06-13_1
- 項目實戰(zhàn)CDMA基站管理_2014-06-13_2
- 項目實戰(zhàn)CDMA基站管理_2014-06-13_3
- 項目實戰(zhàn)CDMA基站管理_2014-06-13_4
- 項目實戰(zhàn)CDMA基站管理_2014-06-13_5
- 項目實戰(zhàn)CDMA基站管理_2014-06-13_6
- 項目實戰(zhàn)CDMA基站管理_2014-06-13_7
- oracle安裝_2014-06-14_3
- oracle安裝_2014-06-14_4
- oracle安裝_2014-06-14_5
- oracle安裝_2014-06-14_6
- oracle編程_2014-06-16_1
- oracle編程_2014-06-16_2
- oracle編程_2014-06-16_3
- oracle編程_2014-06-16_4
- oracle編程_2014-06-16_5
- myqq項目實戰(zhàn)_2014-06-17_1
- myqq項目實戰(zhàn)_2014-06-17_2
- myqq項目實戰(zhàn)_2014-06-17_3
- myqq項目實戰(zhàn)_2014-06-17_4
- myqq項目實戰(zhàn)_2014-06-17_5
- myqq項目實戰(zhàn)_2014-06-18_1
- myqq項目實戰(zhàn)_2014-06-18_2
- myqq項目實戰(zhàn)_2014-06-18_3
- myqq項目實戰(zhàn)_2014-06-18_4
- myqq項目實戰(zhàn)_2014-06-18_5
- myqq項目實戰(zhàn)_2014-06-18_6
- 項目實戰(zhàn)CDMA基站管理_2014-06-14_1
- httpserver項目實戰(zhàn)_2014-06-19_2
- httpserver項目實戰(zhàn)_2014-06-19_3
- httpserver項目實戰(zhàn)_2014-06-19_4
- httpserver項目實戰(zhàn)_2014-06-19_5
- 1.linux環(huán)境搭建(上)
- 1.場景-層-精靈-導演模型
- 01.場景管理
- 02.精靈的創(chuàng)建-幀和紋理的概念-緩存概念
- 03.三個特殊層
- 04.坐標體系
- 01.ZORDERAndTag
- 02.CCLabelTTF和字體
- 03.CCLabelAtlas和CCLabelBMFont
- 04.批處理精靈節(jié)點
- 05.批處理精靈測試
- 06.C++的四種cast
- 1.textFieldTTF
- 2.CCEditBox
- 3.menu基礎和MenuItem
- 1.菜單特效-課程菜單實現(xiàn)
- 2.menu的點擊連續(xù)響應實現(xiàn)
- 3.CCControlSwith和CCControlSlider
- 1.draw
- 2.schedule定時器
- 3.progressTimer
- 1.CCProgressTimer和CCProgressTo
- 2.CCScrollView
- 3.CCTableView
- 4.內(nèi)存管理
- 1.象棋(開始場景和棋盤布置)
- 2.擺起設置
- 1.布局結束
- 2.選擇要走的棋子
- 3.走棋完成
- 網(wǎng)絡編程_2014-06-1_1
- 網(wǎng)絡編程_2014-06-1_2
- 網(wǎng)絡編程_2014-06-1_3
- 網(wǎng)絡編程_2014-06-1_4
- 網(wǎng)絡編程_2014-06-1_5
- 網(wǎng)絡編程_2014-06-1_6
- 網(wǎng)絡編程_2014-06-3_1
- 網(wǎng)絡編程_2014-06-3_2
- 網(wǎng)絡編程_2014-06-3_3
- 網(wǎng)絡編程_2014-06-3_4
- 網(wǎng)絡編程_2014-06-3_5
- shell編程_2014-06-4_1
- shell編程_2014-06-4_2
- shell編程_2014-06-4_3
- win的hook制作方法_2014-06-4_1
- win的hook制作方法_2014-06-4_2
- QT編程_2014-06-6_1
- QT編程_2014-06-6_2
- QT編程_2014-06-6_3
- QT編程_2014-06-6_4
- QT編程_2014-06-6_5
- QT編程_2014-06-6_6
- 1.action
- xs-用法
- 1.單機象棋完成
- 2.象棋人工智能
- xs-用法
- 1.網(wǎng)絡版象棋設計
- 1.windows象棋網(wǎng)絡-技術和業(yè)務概念
- 1.坦克移動
- 01-操作符重載知識點及作業(yè)點評
- 02-子類繼承三種方式
- 03-friend友元函數(shù)申明和應用易錯點
- 04-繼承中的重名和static
- 05-繼承中的構造和析構基礎
- 06-繼承中的混搭風-王保明
- 07-extern修飾全局變量常用套路
- 08-static靜態(tài)變量分配內(nèi)存
- 08-static靜態(tài)變量分配內(nèi)存補充
- 09-多繼承二義性及虛繼承解決方法
- 10-多態(tài)基礎01
- 11-多態(tài)案例-王保明
- 12-多態(tài)的工程意義及多態(tài)成立的三個條件-王保明
- 01-課程復習
- 02-重載與重寫-王保明
- 03-多態(tài)理解面試題層次應答-王保明
- 04-c++編譯器多態(tài)的實現(xiàn)探究-王保明
- 05-父類構造函數(shù)中能產(chǎn)生多態(tài)嗎1
- 05-父類構造函數(shù)中能產(chǎn)生多態(tài)嗎2-原理解釋-王保明
- 06-子類對象和父類指針混搭-王保明
- 07-為什么需要虛析構函數(shù)-王保明
- 08-中午課程總結
- 09-抽象類語法基礎
- 10-接口類在多繼承中的應用-王保明
- 11-cplusplus中接口的封裝和設計和模塊界面分工(軟件架構初步)
- 12-cplusplus接口類模型框架搭建-王保明
一 簡介
Go語言出自Ken Thompson、Rob Pike和Robert Griesemer之手,起源于2007年,并在2009年正式對外發(fā)布,其實都是Google的,設計Go語言的初衷都是為了滿足Google的需求。Go的主要目標是“兼具Python等動態(tài)語言的開發(fā)速度和C/C++等編譯型語言的性能與安全性”,旨在不損失應用程序性能的情況下降低代碼的復雜性,具有“部署簡單、并發(fā)性好、語言設計良好、執(zhí)行性能好”等優(yōu)勢。最主要還是為了并發(fā)而生,并發(fā)是基于goroutine的,goroutine類似于線程,但并非線程,可以將goroutine理解為一種虛擬線程。Go語言運行時會參與調(diào)度goroutine,并將goroutine合理地分配到每個CPU中,最大限度地使用CPU性能。
二 環(huán)境
我們玩Java的時候需要下載JDK,類似于此,用Go開發(fā)也需要下載Go,里面提供各種develop-kit、library以及編譯器。在官網(wǎng)下載mac版本pkg后直接安裝,最后用 go version 命令驗證版本:
然后就是設置這兩個環(huán)境變量,mac系統(tǒng)是在 .bash_profile 文件里面:
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
GOROOT:表示的是Go語言編譯、工具、標準庫等的安裝路徑,其實就相當于配置JAVA_HOME那樣。
GOPATH:這個和Java有點不一樣,Java里并不需要設置這個變量,這個表示Go的工作目錄,是全局的,當執(zhí)行Go命令的時候會依賴這個目錄,相當于一個全局的workspace。一般還會把$GOPATH/bin設置到PATH目錄,這樣編譯過的代碼就可以直接執(zhí)行了。
1 純文本開發(fā)
編寫代碼,可以保存在任意地方,例如新建一個helloworld目錄,創(chuàng)建hello.go文件:
package main
import "fmt"
func main() {
fmt.Println("hello, world")
}
然后執(zhí)行 go build hello.go 就可以編譯出hello文件,在./hello就可以執(zhí)行了;或者直接 go run hello.go 合二為一去執(zhí)行。執(zhí)行這個命令并不需要設置環(huán)境變量就可以了。看起來和c差不多,但是和Java不一樣,運行的時候不需要虛擬機。早期的GO工程也是使用Makefile來編譯,后來有了強大的命令 go build、go run,可以直接識別目錄還是文件。
2 GoLand
自動import,超爽的體驗!不用按command + /了!
運行項目需要設置build config,和Android、Java的都差不多,例如創(chuàng)建一個hello-goland項目:
導入go module項目的時候需要勾選這項,否則無法像maven/gradle那樣sync下載依賴:
3 VSCODE
直接搜索Go插件,第一個最多安裝量的就是了,我還沒用過所以不太清楚如何。
三 工程結構
在設置GOPATH環(huán)境變量的時候,這個目錄里面又分了三個子目錄bin、pkg、src,分別用于存放可執(zhí)行文件、包文件和源碼文件。當我們執(zhí)行Go命令的時候,如果我們指定的不是當前目錄的文件或者絕對路徑的目錄的話,就會去GOPATH目錄的去找。這樣在GOPATH目錄創(chuàng)建了xxx的目錄后,就可以在任意地方執(zhí)行 go build xx 命令來構建或者運行了。
pkg目錄應該是在執(zhí)行 go install 后生成的包文件,包括.a這樣的文件,相當于一個歸檔。
├── bin
│ ├── air
│ ├── govendor
│ ├── swag
│ └── wire
├── pkg
│ ├── darwin_amd64
│ ├── mod
│ └── sumdb
└── src
├── calc
├── gin-blog
├── github.com
├── golang.org
├── google.golang.org
├── gopkg.in
└── simplemath
這樣對于我們具體項目來說并不好,沒有Workspace的概念來隔離每個項目了,所以我覺得這個GOPATH目錄放的應該是公用的項目,例如開源依賴的。我們在開發(fā)過程中,也會下載很多的依賴,這些依賴都下載到這個目錄,和我們的項目文件混在一起了。
另外,通過IDE可以設置project的GOPATH,相當于在執(zhí)行的時候給GOPATH增加了一個目錄變量,也就是說,我們創(chuàng)建一個項目,然后里面也有bin、src、pkg這三個目錄,和GOPATH一樣的,本質(zhì)上,IDE在運行的時候其實就是設置了一下GOPATH:
GOPATH=/Users/fuxing/develop/testgo/calc-outside:/Users/fuxing/develop/go #gosetup
Go語言在尋找變量、函數(shù)、類屬性及方法的時候,會先查看GOPATH這個系統(tǒng)環(huán)境變量,然后根據(jù)該變量配置的路徑列表依次去對應路徑下的src目錄下根據(jù)包名查找對應的目錄,如果對應目錄存在,則再到該目錄下查找對應的變量、函數(shù)、類屬性和方法。
其實官方提供了Go Modules的方法更好解決。
1 Go Modules
從Go 1.11版本開始,官方提供了Go Modules管理項目和依賴,從1.13版本開始,更是默認開啟了對Go Modules的支持,使用Go Modules的好處是顯而易見的 —— 不需要再依賴GOPATH,你可以在任何位置創(chuàng)建Go項目,并且在國內(nèi),可以通過 GOPROXY 配置鏡像源加速依賴包的下載。也就是說,創(chuàng)建一個項目就是一個mod,基本上目前Go開源項目都是這樣做的。其實就是類似于Maven和Gradle。
// 創(chuàng)建mod項目,也是可以用IDE來new一個mod項目的:
go mod init calc-mod
// 一般開源在github上面的項目名字是這樣的;和maven、gradle不一樣的是,開發(fā)完成根本不需要發(fā)布到倉庫!只要提交代碼后打tag就可以了
go mod init github.com/fuxing-repo/fuxing-module-name
// 創(chuàng)建一個模塊:執(zhí)行這個命令主要是多了一個go.mod文件,里面就一行內(nèi)容:
module calc-mod
// import以后,執(zhí)行下載依賴命令,不需要編輯go.mod文件。依賴會下載到GOPATH/pkg/mod目錄
go list
用GoLand來打開不同的項目,顯示依賴的外部庫是不一樣的,如果是用GOPATH創(chuàng)建的項目,需要用命令下載依賴包到GOPATH:
go get -u github.com/fuxing-repo/fuxing-module-name
四 語法
1 包:Package 和 Import
Java里面的包名一般是很長的,和文件夾名稱對應,作用就是命名空間,引入的時候需要寫長長的一串,也可以用通配符:
Go里面一般的包名是當前的文件夾名稱,同一個項目里面,可以存在同樣的包名,如果同時都需要引用同樣包名的時候,就可以用alias區(qū)分,類似于JS那樣。一般import的是一個包,不像Java那樣import具體的類。同一個包內(nèi),不同文件,但是里面的東西是可以使用的,不需要import。這有點類似于C的include吧。如果多行的話,用括號換行包起來。
Go語言中,無論是變量、函數(shù)還是類屬性及方法,它們的可見性都是與包相關聯(lián)的,而不是類似Java那樣,類屬性和方法的可見性封裝在對應的類中,然后通過 private、protected 和 public 這些關鍵字來描述其可見性,Go語言沒有這些關鍵字,和變量和函數(shù)一樣,對應Go語言的自定義類來說,屬性和方法的可見性根據(jù)其首字母大小寫來決定,如果屬性名或方法名首字母大寫,則可以在其他包中直接訪問這些屬性和方法,否則只能在包內(nèi)訪問,所以Go語言中的可見性都是包一級的,而不是類一級的。
在Java里面,只有靜態(tài),或者對象就可以使用點運算符,而且是極其常用的操作,而在Go里面,還可以用一個包名來點,這就是結合了import來使用,可以點出一個函數(shù)調(diào)用,也可以點出一個結構體,一個接口。另外區(qū)別于C,不管是指針地址,還是對象引用,都是用點運算符,不需要考慮用點還是箭頭了!
