作為一個(gè)測(cè)試,作為一個(gè)測(cè)試開發(fā), 全棧化+管理 是我們未來的發(fā)展方向。已經(jīng)掌握了Java、Python、HTML的你,是不是也想了解下最近異常火爆的Go語言呢?來吧,讓我們一起了解下。
成都創(chuàng)新互聯(lián)公司長期為上1000+客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為大安企業(yè)提供專業(yè)的成都網(wǎng)站建設(shè)、做網(wǎng)站,大安網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
Go 是一個(gè)開源的編程語言 ,它能讓構(gòu)造簡單、可靠且高效的軟件變得容易。
Go是從2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持開發(fā),后來還加入了Ian Lance Taylor, Russ Cox等人,并最終于2009年11月開源,在2012年早些時(shí)候發(fā)布了Go 1穩(wěn)定版本?,F(xiàn)在Go的開發(fā)已經(jīng)是完全開放的,并且擁有一個(gè)活躍的社區(qū)。這三個(gè)人都是計(jì)算機(jī)界的大神,有的參與了C語言的編寫,有的還是數(shù)學(xué)大神,有的還獲得了計(jì)算機(jī)最高榮譽(yù)-圖靈獎(jiǎng)。
接下來說說 Go語言的特色 :
簡潔、快速、安全
并行、有趣、開源
內(nèi)存管理、數(shù)組安全、編譯迅速
Go語言的用途 :
Go 語言被設(shè)計(jì)成一門應(yīng)用于搭載 Web 服務(wù)器,存儲(chǔ)集群或類似用途的巨型中央服務(wù)器的系統(tǒng)編程語言。
對(duì)于高性能分布式系統(tǒng)領(lǐng)域而言,Go 語言無疑比大多數(shù)其它語言有著更高的開發(fā)效率。它提供了海量并行的支持,這對(duì)于 游戲 服務(wù)端的開發(fā)而言是再好不過了。
Go語言的環(huán)境安裝:
建議直接打開 官方地址因?yàn)閴Φ脑虼虿婚_
因?yàn)槲矣玫氖莣indows系統(tǒng),這里主要講下Windows系統(tǒng)上使用Go語言來編程。
Windows 下可以使用 .msi 后綴(在下載列表中可以找到該文件,如go1.17.2.windows-amd64.msi)的安裝包來安裝。
默認(rèn)情況下 .msi 文件會(huì)安裝在 c:Go 目錄下。你可以將 c:Gobin 目錄添加到 Path 環(huán)境變量中。添加后你需要重啟命令窗口才能生效。個(gè)人建議還是安裝到 Program Files文件夾中。
使用什么開發(fā)工具來對(duì)Go語言進(jìn)行編寫:
個(gè)人建議用VS code, 也可以用Sublime Text來編輯。如果你之前看了我講的HTML語言的學(xué)習(xí),肯定已經(jīng)下載了VS code. 那么這時(shí)你需要在VS code中下載Go語言的擴(kuò)展插件。
這里有一個(gè)巨大的坑,就是在下載Go的插件和依賴包時(shí),會(huì)提示一些包沒有。主要是因?yàn)橄螺d的依賴包部分被墻了,只能想別的辦法去下載。
建議參考網(wǎng)頁:
解決vscode中g(shù)olang插件安裝失敗方法
在學(xué)習(xí)go的過程中,使用的是vscode,但是一直提示安裝相關(guān)插件失敗,然后上網(wǎng)查方法,基本上是叫你建立golang.org目錄什么的,結(jié)果全是錯(cuò)的,而且都是抄襲,很煩。無意之中看到一位博主分享的方法,他也是飽受上述的垃圾博文困擾,然后找到了解決方法,這里向他致敬,秉著讓更多人看到正確解決方法的心,我寫下正確的解決方法,希望對(duì)你有所幫助,也可以點(diǎn)開原博主鏈接參考:
Go有一個(gè)全球模塊代理,設(shè)置代理再去安裝golang的插件,就可以安裝成功了。步驟有,首先Windows用戶打開Powershell,一個(gè)藍(lán)色的界面,注意不是cmd!不知道的直接打開window下面的搜索,然后輸入powershell,搜索出來就可以了。
$env:GO111MODULE=“on”
$env:GOPROXY=“”
go env -w GOPROXY=
go env -w GOPRIVATE=*.corp.example.com
然后我們打開VsCode界面,下面會(huì)提示安裝插件,我們選擇Install ALL,就會(huì)安裝成功
當(dāng)你在運(yùn)行Go語言程序時(shí),提示所有的插件包都已經(jīng)安裝成功了時(shí),就可以正常使用了,要不然一堆報(bào)錯(cuò)會(huì)讓你非常心煩。
好了,今天先到這里,晚安、下班~
前端框架越來越豐富,前后端分離已經(jīng)是大多數(shù)軟件團(tuán)隊(duì)采取的模式了。vue使用的場(chǎng)景也越來越多。
go本來使用template模板來進(jìn)行前端的表現(xiàn),現(xiàn)在可以用vue來分擔(dān)很大一部分工作了。
通常直接使用go語言寫后端,然后使用靜態(tài)模板加載渲染前端,前端獲取后端提供的數(shù)據(jù)是使用{{ }}符號(hào),2個(gè)套在一起的花括號(hào)。這個(gè)也是vue使用的數(shù)據(jù)表現(xiàn)方式。
如果go+vue來協(xié)同工作的話,需要對(duì)vue進(jìn)行一點(diǎn)設(shè)置。比如把{{ }}的方式改為[[ ]]的方式。
首先我們要知道,vue的使用,需要在頁面中加載vue.js或vue.min.js
純靜態(tài)網(wǎng)頁使用vue是這樣的(給個(gè)html例子)
然后我們實(shí)現(xiàn)一個(gè)go的簡單web服務(wù)和模板頁面
這個(gè)go服務(wù)器通過端口 1989 展示服務(wù)器頁面,提供了一個(gè)靜態(tài)文件路徑 htmlpage,我們把vue.js和index.html文件都放置在htmlpage路徑里。
go服務(wù)器還用模板給前臺(tái)頁面提供了一個(gè)News結(jié)構(gòu)的數(shù)據(jù),數(shù)據(jù)包括:Title,Content,Author的值。
在index.html頁面中,加載vue.js的時(shí)候需要帶上靜態(tài)路徑 htmlpage
在 new 一個(gè) vue 變量的時(shí)候,必須有一句來設(shè)置包裹數(shù)據(jù)的符號(hào),我們這里設(shè)置這個(gè)符號(hào)為[[ ]]
同時(shí),所有需要由 vue 渲染的數(shù)據(jù),都寫成類似這樣的樣子
在 go + vue 方式下的完整模板文件 index.html
此頁面中{{ }}包裹的數(shù)據(jù)是由go從后端提供的數(shù)據(jù)( 例如:{{.Title}}),而[[ ]]包裹的數(shù)據(jù),是vue渲染的數(shù)據(jù)。
只是把 Vue里的數(shù)據(jù),改為由go后端提供即可。
好吧,作者已經(jīng)在向月亮示愛了。呵呵 _
運(yùn)行一下程序,看修改模板后的效果。
create database db
use db
create table 借閱等級(jí)信息(
借閱等級(jí) int primary key,
最長借閱時(shí)間 int,
最大借閱數(shù)量 int,
)
insert into 借閱等級(jí)信息 values
(0, 30, 10),
(1, 60, 20),
(2, 90, 30),
(3, 120, 40)
create table 讀者信息(
姓名 char(15) not null,
證件號(hào) char(12) primary key,
借閱等級(jí) int default 0,
累計(jì)借書 int default 0,
foreign key(借閱等級(jí)) references 借閱等級(jí)信息(借閱等級(jí))
)
insert into 讀者信息(姓名, 證件號(hào), 借閱等級(jí)) values
('張三', '541607120165', 1),
('李四', '541707010185', 3),
('王五', '541707120165', 1),
('趙六', '541505980268', 2),
('孫七', '541407010169', 0),
('周八', '541307010489', 1)
create table 出版社信息(
出版社 varchar(20) primary key,
地址 varchar(25),
聯(lián)系電話 char(7)
)
insert into 出版社信息 values
('清華大學(xué)出版社', '北京', '4979421'),
('晟威出版社', '天津', '5564130'),
('南海出版公司', '海南', '4984910'),
('上海文藝出版社', '上海', '6640239')
create table 圖書信息(
索書號(hào) char(15) primary key,
作者 char(15),
書名 char(15),
出版社 varchar(20),
出版時(shí)間 date,
foreign key(出版社)references 出版社信息(出版社)
)
insert into 圖書信息 values
('b12987', '嚴(yán)蔚敏', '數(shù)據(jù)結(jié)構(gòu)', '清華大學(xué)出版社', '2012-02-06'),
('b97894', '東野圭吾', '幻夜', '南海出版公司', '2004-08-02'),
('b16546', '吳玉華', '物理實(shí)驗(yàn)教程', '清華大學(xué)出版社', '2013-05-15'),
('b89490', '張雪峰', '考研指點(diǎn)', '晟威出版社', '2016-12-12'),
('b56400', '郟宗培', '紙上尋仙記', '上海文藝出版社', '2011-02-05')
create table 單本圖書信息(
條碼號(hào) char(7) primary key check(len(條碼號(hào)) = 7),
索書號(hào) char(15),
館藏地 varchar(40),
書刊狀態(tài) varchar(6) check(書刊狀態(tài) in ('可借', '借出', '非可借')),
歷史借閱量 int default 0,
foreign key(索書號(hào))references 圖書信息(索書號(hào))
)
insert into 單本圖書信息(條碼號(hào), 索書號(hào), 館藏地, 書刊狀態(tài)) values
('t987628', 'b97894', '三樓A8', '借出'),
('t594805', 'b97894', '二樓C7', '可借'),
('t984910', 'b89490', '五樓A2', '借出'),
('t940566', 'b12987', '負(fù)一樓D3', '借出')
create table 借閱信息(
借閱號(hào) char(6) primary key,
借閱時(shí)間 date,
歸還時(shí)間 date,
圖書條碼號(hào) char(7),
借閱人證件號(hào) char(12),
foreign key(圖書條碼號(hào)) references 單本圖書信息(條碼號(hào)),
foreign key(借閱人證件號(hào)) references 讀者信息(證件號(hào))
)
create table 評(píng)論信息(
評(píng)論號(hào) char(8) primary key,
評(píng)分 numeric(2, 1),
內(nèi)容 varchar(200),
評(píng)論時(shí)間 date,
評(píng)論者id char(12),
索書號(hào) char(15),
foreign key(索書號(hào))references 圖書信息(索書號(hào)),
foreign key(評(píng)論者id)references 讀者信息(證件號(hào))
)
insert into 評(píng)論信息 values
('p12391', 8.9, '很有趣', '2015-06-24', '541707010185', 'b97894'),
('p98523', 7.8, '受益頗多', '2016-05-22', '541307010489', 'b89490'),
('p94606', 6.8, '完全看不懂orz', '2017-05-02', '541607120165', 'b12987')
create table 主題詞信息(
ID char(8) primary key,
類別 char(15),
索書號(hào) char(15),
foreign key(索書號(hào))references 圖書信息(索書號(hào))
)
insert into 主題詞信息 values
('z64400', '計(jì)算機(jī)', 'b12987'),
('z95410', '物理', 'b16546'),
('z98500', '考研', 'b89490'),
('z64165', '推理\懸疑', 'b97894'),
('z69850', '仙俠', 'b56400')
use db
go
create trigger trigger1
on 借閱信息
after insert
as
begin?
update 讀者信息? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?--更改讀者累計(jì)借書量
set 累計(jì)借書 = 累計(jì)借書 + 1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
from 讀者信息, inserted
where 讀者信息.證件號(hào) = inserted.借閱人證件號(hào)
update 單本圖書信息? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?--更改圖書狀態(tài)
set 單本圖書信息.書刊狀態(tài) = '借出'
from inserted, 單本圖書信息
where inserted.圖書條碼號(hào) = 單本圖書信息.條碼號(hào)
update 單本圖書信息
set 歷史借閱量 = 歷史借閱量 + 1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?--更改圖書歷史借閱量
from inserted, 單本圖書信息
where inserted.圖書條碼號(hào) = 單本圖書信息.條碼號(hào)
end
insert into 借閱信息 values
('j13488', '2018-05-01', '2018-08-01', 't987628', '541407010169')
insert into 借閱信息 values
('j14910', '2016-12-11', '2017-01-25', 't984910', '541607120165')
insert into 借閱信息 values
('j97890', '2018-05-14', '2018-06-14', 't940566', '541607120165')
go
create view view_1(圖書條碼, 借閱者姓名, 編號(hào), 借閱時(shí)間, 應(yīng)還時(shí)間)
as
select 圖書條碼號(hào), 姓名, 證件號(hào), 借閱時(shí)間, 歸還時(shí)間
from 借閱信息, 讀者信息
where 借閱信息.借閱人證件號(hào) = 讀者信息.證件號(hào) and 歸還時(shí)間 getdate()
go
create view view_2(圖書條碼, 歷史總借閱量)
as
select 條碼號(hào), 歷史借閱量
from 單本圖書信息, 圖書信息
where 單本圖書信息.索書號(hào) = 圖書信息.索書號(hào) and 書名 = '幻夜'
go
create view view_3(類別, 圖書條碼, 歷史總借閱量)
as
select 類別, 條碼號(hào), 歷史借閱量
from 單本圖書信息, 圖書信息, 主題詞信息
where 主題詞信息.索書號(hào) = 圖書信息.索書號(hào) and 圖書信息.索書號(hào) = 單本圖書信息.索書號(hào) and 類別 = '考研'
go
create view view_4(讀者編號(hào), 條碼, 圖書名稱, 應(yīng)還日期)
as
select 借閱人證件號(hào), 圖書條碼號(hào), 書名, 歸還時(shí)間
from 單本圖書信息, 圖書信息, 借閱信息
where 借閱信息.圖書條碼號(hào) = 單本圖書信息.條碼號(hào) and 單本圖書信息.索書號(hào) = 圖書信息.索書號(hào)
and 歸還時(shí)間 getdate() and 借閱人證件號(hào) = '541607120165'
go
create view view_5(讀者編號(hào), 圖書條碼, 圖書名稱, 借閱日期, 歸還日期)
as
select 借閱人證件號(hào), 圖書條碼號(hào), 書名, 借閱時(shí)間, 歸還時(shí)間
from 單本圖書信息, 圖書信息, 借閱信息
where 借閱信息.圖書條碼號(hào) = 單本圖書信息.條碼號(hào) and 單本圖書信息.索書號(hào) = 圖書信息.索書號(hào)
and 借閱人證件號(hào) = '541607120165'
go
create view view_6(讀者編號(hào), 圖書名稱, 評(píng)論時(shí)間, 評(píng)論內(nèi)容)
as
select 評(píng)論者id, 書名, 評(píng)論時(shí)間, 內(nèi)容
from 借閱信息, 單本圖書信息, 評(píng)論信息, 圖書信息
where 借閱信息.圖書條碼號(hào) = 單本圖書信息.條碼號(hào) and 單本圖書信息.索書號(hào) = 評(píng)論信息.索書號(hào)
and 評(píng)論信息.索書號(hào) = 圖書信息.索書號(hào) and 評(píng)論者id = '541607120165'
go
create view view_7(出版社名稱, 圖書名稱, 出版時(shí)間)
as
select top 100 percent 出版社信息.出版社, 書名, 出版時(shí)間
from 出版社信息, 圖書信息
where 出版社信息.出版社 = 圖書信息.出版社
order by 出版時(shí)間 asc
--執(zhí)行
select * from view_1
select * from view_2
select * from view_3
select * from view_4
select * from view_5
select * from view_6
select * from view_7 order by 出版時(shí)間 asc
擴(kuò)展資料:
數(shù)據(jù)庫模型:
對(duì)象模型
層次模型(輕量級(jí)數(shù)據(jù)訪問協(xié)議)
網(wǎng)狀模型(大型數(shù)據(jù)儲(chǔ)存)
關(guān)系模型
面向?qū)ο竽P?/p>
半結(jié)構(gòu)化模型
平面模型(表格模型,一般在形式上是一個(gè)二維數(shù)組。如表格模型數(shù)據(jù)Excel)
架構(gòu)
數(shù)據(jù)庫的架構(gòu)可以大致區(qū)分為三個(gè)概括層次:內(nèi)層、概念層和外層。
內(nèi)層:最接近實(shí)際存儲(chǔ)體,亦即有關(guān)數(shù)據(jù)的實(shí)際存儲(chǔ)方式。
外層:最接近用戶,即有關(guān)個(gè)別用戶觀看數(shù)據(jù)的方式。
概念層:介于兩者之間的間接層。
數(shù)據(jù)庫索引
主條目:數(shù)據(jù)庫索引
數(shù)據(jù)索引的觀念由來已久,像是一本書前面幾頁都有目錄,目錄也算是索引的一種,只是它的分類較廣,例如車牌、身份證字號(hào)、條碼等,都是一個(gè)索引的號(hào)碼,當(dāng)我們看到號(hào)碼時(shí),可以從號(hào)碼中看出其中的端倪,若是要找的人、車或物品,也只要提供相關(guān)的號(hào)碼,即可迅速查到正確的人事物。
另外,索引跟字段有著相應(yīng)的關(guān)系,索引即是由字段而來,其中字段有所謂的關(guān)鍵字段(Key Field),該字段具有唯一性,即其值不可重復(fù),且不可為"空值(null)"。
例如:在合并數(shù)據(jù)時(shí),索引便是扮演欲附加字段數(shù)據(jù)之指向性用途的角色。故此索引為不可重復(fù)性且不可為空。
數(shù)據(jù)庫操作:事務(wù)
主條目:數(shù)據(jù)庫事務(wù)
事務(wù)(transaction)是用戶定義的一個(gè)數(shù)據(jù)庫操作序列,這些操作要么全做,要么全不做,是一個(gè)不可分割的工作單位。
事務(wù)的并發(fā)性是指多個(gè)事務(wù)的并行操作輪流交叉運(yùn)行,事務(wù)的并發(fā)可能會(huì)訪問和存儲(chǔ)不正確的數(shù)據(jù),破壞交易的隔離性和數(shù)據(jù)庫的一致性。
網(wǎng)狀數(shù)據(jù)模型的數(shù)據(jù)結(jié)構(gòu) 網(wǎng)狀模型 滿足下面兩個(gè)條件的基本層次聯(lián)系的集合為網(wǎng)狀模型。 1. 允許一個(gè)以上的結(jié)點(diǎn)無雙親; 2. 一個(gè)結(jié)點(diǎn)可以有多于一個(gè)的雙親。
參考資料來源:百度百科——數(shù)據(jù)庫
基本設(shè)計(jì)思路:
類型轉(zhuǎn)換、類型斷言、動(dòng)態(tài)派發(fā)。iface,eface。
反射對(duì)象具有的方法:
編譯優(yōu)化:
內(nèi)部實(shí)現(xiàn):
實(shí)現(xiàn) Context 接口有以下幾個(gè)類型(空實(shí)現(xiàn)就忽略了):
互斥鎖的控制邏輯:
設(shè)計(jì)思路:
(以上為寫被讀阻塞,下面是讀被寫阻塞)
總結(jié),讀寫鎖的設(shè)計(jì)還是非常巧妙的:
設(shè)計(jì)思路:
WaitGroup 有三個(gè)暴露的函數(shù):
部件:
設(shè)計(jì)思路:
結(jié)構(gòu):
Once 只暴露了一個(gè)方法:
實(shí)現(xiàn):
三個(gè)關(guān)鍵點(diǎn):
細(xì)節(jié):
讓多協(xié)程任務(wù)的開始執(zhí)行時(shí)間可控(按順序或歸一)。(Context 是控制結(jié)束時(shí)間)
設(shè)計(jì)思路: 通過一個(gè)鎖和內(nèi)置的 notifyList 隊(duì)列實(shí)現(xiàn),Wait() 會(huì)生成票據(jù),并將等待協(xié)程信息加入鏈表中,等待控制協(xié)程中發(fā)送信號(hào)通知一個(gè)(Signal())或所有(Boardcast())等待者(內(nèi)部實(shí)現(xiàn)是通過票據(jù)通知的)來控制協(xié)程解除阻塞。
暴露四個(gè)函數(shù):
實(shí)現(xiàn)細(xì)節(jié):
部件:
包: golang.org/x/sync/errgroup
作用:開啟 func() error 函數(shù)簽名的協(xié)程,在同 Group 下協(xié)程并發(fā)執(zhí)行過程并收集首次 err 錯(cuò)誤。通過 Context 的傳入,還可以控制在首次 err 出現(xiàn)時(shí)就終止組內(nèi)各協(xié)程。
設(shè)計(jì)思路:
結(jié)構(gòu):
暴露的方法:
實(shí)現(xiàn)細(xì)節(jié):
注意問題:
包: "golang.org/x/sync/semaphore"
作用:排隊(duì)借資源(如錢,有借有還)的一種場(chǎng)景。此包相當(dāng)于對(duì)底層信號(hào)量的一種暴露。
設(shè)計(jì)思路:有一定數(shù)量的資源 Weight,每一個(gè) waiter 攜帶一個(gè) channel 和要借的數(shù)量 n。通過隊(duì)列排隊(duì)執(zhí)行借貸。
結(jié)構(gòu):
暴露方法:
細(xì)節(jié):
部件:
細(xì)節(jié):
包: "golang.org/x/sync/singleflight"
作用:防擊穿。瞬時(shí)的相同請(qǐng)求只調(diào)用一次,response 被所有相同請(qǐng)求共享。
設(shè)計(jì)思路:按請(qǐng)求的 key 分組(一個(gè) *call 是一個(gè)組,用 map 映射存儲(chǔ)組),每個(gè)組只進(jìn)行一次訪問,組內(nèi)每個(gè)協(xié)程會(huì)獲得對(duì)應(yīng)結(jié)果的一個(gè)拷貝。
結(jié)構(gòu):
邏輯:
細(xì)節(jié):
部件:
如有錯(cuò)誤,請(qǐng)批評(píng)指正。