Struct values encode as JSON objects. Each exported struct field becomes a member of the object unless
The empty values are false, 0, any nil pointer or interface value, and any array, slice, map, or string of length zero. The object's default key string is the struct field name but can be specified in the struct field's tag value. The "json" key in the struct field's tag value is the key name, followed by an optional comma and options. Examples:
// Field is ignored by this package.
Field int json:"-"
// Field appears in JSON as key "myName".
Field int json:"myName"
// Field appears in JSON as key "myName" and
// the field is omitted from the object if its value is empty,
// as defined above.
Field int json:"myName,omitempty"
// Field appears in JSON as key "Field" (the default), but
// the field is skipped if empty.
// Note the leading comma.
Field int json:",omitempty"
The "string" option signals that a field is stored as JSON inside a JSON-encoded string. It applies only to fields of string, floating point, integer, or boolean types. This extra level of encoding is sometimes used when communicating with JavaScript programs:
Int64String int64 json:",string"
The key name will be used if it's a non-empty string consisting of only Unicode letters, digits, dollar signs, percent signs, hyphens, underscores and slashes.
好吧,問(wèn)了一圈終于在某個(gè)群里有大神回答我了,這是golang的bug,詳見(jiàn)https://github.com/golang/go/...
Controller.Get
api中,你不應(yīng)該暴露key和加密方法到客戶端,你應(yīng)該采用https + 用戶token的方式訪問(wèn)你后端接口
你現(xiàn)在init 中的Db是一個(gè)局部變量,并不是你var聲明的Db
package main
import (
"database/sql"
_ "-/github.com/go-sql-driver/mysql"
"log"
"fmt"
)
var Db *sql.DB
func init() {
var err error // 首先聲明出來(lái)err
Db , err = sql.Open("mysql","root:root@tcp(localhost:3306)/sql")
if err != nil {
log.Fatal(err)
}
Db.Ping()
fmt.Println(Db)
}
func main() {
fmt.Print(Db)
}
這樣就可以了
大致上跟其它編譯到機(jī)器碼的語(yǔ)言一樣:別人只能看匯編了。
不過(guò),「故考慮把核心部分換語(yǔ)言重構(gòu)」,如果你考慮在同一進(jìn)程里同時(shí)使用 Go 和另一種語(yǔ)言,特別是解釋型語(yǔ)言的話,還是放棄吧。Go 和 C 之間的調(diào)用已經(jīng)被 Go 核心開(kāi)發(fā)者警告了(請(qǐng)搜索「cgo is not go」;你沒(méi)看到 Go 語(yǔ)言的項(xiàng)目都是自個(gè)兒干活,極少有混編的情況),和其它大運(yùn)行時(shí)的程序調(diào)……你饒了你自己吧。
出于代碼保護(hù)目的,建議使用 Rust,和 Python、Ruby、Lua、NodeJS、Haskell、C、C++ 等等語(yǔ)言相互調(diào)用都容易得多。
背景
目前項(xiàng)目中會(huì)使用了Iaas中的vm,所有操作都是通過(guò)ssh連上去的。pm表示要不要寫個(gè)agent在里面用,現(xiàn)在每次操作都ssh一下都很惡心。
談?wù)勎艺J(rèn)為使用ssh的好處:
代碼集中在一處,不需要分發(fā)
不需要維護(hù)agent這么一個(gè)進(jìn)程的生命周期,以及檢測(cè)它的心跳
缺點(diǎn):
不支持異步
我想問(wèn)的問(wèn)題
ssh的開(kāi)銷大嗎?在我看來(lái)似乎和寫一個(gè)基于web server 的agent差不多
大家一般是如何選型的?為什么這么選?
這個(gè)東西以前做過(guò)類似的,也有過(guò)反思,甚至設(shè)計(jì)的原型和你說(shuō)的一模一樣。
例如,我為什么要用基于web server的agent呢,我干嘛不用tcp長(zhǎng)連接到服務(wù)端,這樣執(zhí)行的結(jié)果可以流式傳輸?shù)秸{(diào)用方,他那邊顯示起來(lái)比較平滑,不用每個(gè)命令執(zhí)行完等結(jié)果。
但是我這樣搞的話,中控端流量和日志存儲(chǔ)就成了問(wèn)題了啊。
如果我的業(yè)務(wù)都在云上,如果不同機(jī)房網(wǎng)絡(luò)不互通的話,我又要蛋疼地搞點(diǎn)兼容的事情……
例如,agent的生命周期,為什么我要檢測(cè)她的心跳呢?機(jī)器上萬(wàn)臺(tái)的話,任何可能的事情都會(huì)發(fā)生啊,修復(fù)起來(lái)太蛋疼了。但是我不處理的話……所以后面我會(huì)考慮用ssh來(lái)修復(fù)agent啊。
我假設(shè)你所有的機(jī)器都是linux,發(fā)行版為同一種。
SSH:
AGENT:
大公司有各種審計(jì)、安全方面的需求,會(huì)把這種事情統(tǒng)一到某個(gè)地方,搞個(gè)中控端,所有的批量操作必須通過(guò)中控端。模式也不一樣,有些用agent,有些用ssh,只有中控端才是必須要有的。
再說(shuō)的直白點(diǎn),
你是個(gè)小公司,小于30臺(tái)機(jī)器或者小于50臺(tái)機(jī)器的話,不建議考慮agent模式。
沒(méi)那個(gè)需求,投入的成本大而收效低。
基于各種第三方框架包裝一個(gè)就好了嘛,嫌麻煩就ansible用起。
23333,你這個(gè)是最經(jīng)典的函數(shù)防抖應(yīng)用場(chǎng)景。
使函數(shù)在一定的時(shí)間內(nèi)不被再調(diào)用后執(zhí)行。
也就是說(shuō),當(dāng)你觸發(fā)scroll或者change時(shí),不要直接去修改數(shù)據(jù),而是添加一個(gè)定時(shí)器來(lái)執(zhí)行修改數(shù)據(jù)的操作,在下次觸發(fā)函數(shù)時(shí),清除這個(gè)定時(shí)器,然后重新設(shè)置定時(shí)器。
或者說(shuō)用函數(shù)節(jié)流的方式也可以實(shí)現(xiàn)你的效果。
// 函數(shù)節(jié)流的實(shí)現(xiàn)方案
let throttleIdentify = 0
$dragable.addEventListener('mousemove', () => {
if (throttleIdentify) return
throttleIdentify = setTimeout(() => throttleIdentify = 0, 500)
console.log('trigger')
})
// 函數(shù)防抖方案
let debounceIdentify = 0
window.addEventListener('resize', () => {
debounceIdentify && clearTimeout(debounceIdentify)
debounceIdentify = setTimeout(() => {
console.log('trigger')
}, 300)
})
看選擇咯,目的都是限制函數(shù)執(zhí)行的頻率。
這里有一篇之前的博客可以參考:函數(shù)節(jié)流與函數(shù)防抖
Access-Control-Allow-Origin 添加這個(gè)響應(yīng)頭就可以了,
Option第一次請(qǐng)求的時(shí)候,發(fā)現(xiàn)存在這個(gè)頭,并且這個(gè)頭的設(shè)置允許你的域名就可以返回200 ,然后客戶端再次發(fā)起真正的請(qǐng)求
看你對(duì)并發(fā)的需求,如果并發(fā)量很大,還是需要連接池的
https://github.com/go-kit/kit 是一個(gè)微服務(wù)工具包,再搭配使用webserver https://github.com/gin-gonic/gin 可以很好的實(shí)現(xiàn)微服務(wù)架構(gòu)
type Images struct {
//內(nèi)部屬性都要大寫字母開(kāi)頭,屬性節(jié)點(diǎn)的名稱變量名固定為XMLName,內(nèi)部的文本統(tǒng)一叫innerxml
Index int `xml:"index,attr"` //表示屬性
InnerText string `xml:",innerxml"` //表示文本
}
type Mimages struct {
XMLName xml.Name `xml:"moreImages"`
Img []Images `xml:"img"`
}
片段:
var _moreImages []Images
for i, v := range _imgs {
if i == 0 {
_firstImg = v
} else {
_moreImages = append(_moreImages, Images{InnerText: v, Index: i})
}
}
moreImages := Mimages{Img: _moreImages}你要取map中的值,無(wú)論是原生map還是sync.Map,難免會(huì)遇到值拷貝,除非你存進(jìn)去的是一個(gè)指針/地址,大的“對(duì)象”可以存指針進(jìn)去。
此外,sync.Map底層使用的是interface{}作為鍵值對(duì),因此效率不是很高,可以參考一下gf框架的gmap包,以下是基準(zhǔn)測(cè)試結(jié)果:
john@johnstation:~/Workspace/Go/GOPATH/src/gitee.com/johng/gf/g/container/gmap$ go test *.go -bench=".*"
goos: linux
goarch: amd64
BenchmarkGmapSet-8 10000000 181 ns/op
BenchmarkSyncmapSet-8 5000000 366 ns/op
BenchmarkGmapGet-8 30000000 82.6 ns/op
BenchmarkSyncmapGet-8 20000000 95.7 ns/op
BenchmarkGmapRemove-8 20000000 69.8 ns/op
BenchmarkSyncmapRmove-8 20000000 93.6 ns/op
PASS
ok command-line-arguments 27.950s你的需求看上去不是簡(jiǎn)單的腳本能夠解決的,更偏向于開(kāi)發(fā)一個(gè)系統(tǒng)了。
這個(gè)有不少的開(kāi)源軟件,zabbix nagios.等等。
如果你自己開(kāi)發(fā),可能要考慮到數(shù)據(jù)采集,數(shù)據(jù)處理,界面展示。
實(shí)際上做完這些基本可以說(shuō)是一個(gè)全棧工程師了。后臺(tái)接口的設(shè)計(jì),數(shù)據(jù)表設(shè)計(jì),前端圖表等等。
如果你的時(shí)間充足,能力強(qiáng),這個(gè)過(guò)程還是非常的有收獲。
基于監(jiān)控方式,可以參考開(kāi)源軟件,或者自己根據(jù)實(shí)際需求出發(fā)。監(jiān)控這個(gè)話題太大,我簡(jiǎn)單的從總體角度出發(fā)去闡述。
謝邀
你可以參考以下步驟
1、解決項(xiàng)目依賴問(wèn)題:
使用 govendor、dep 這類工具,將項(xiàng)目依賴放到 myapp 項(xiàng)目下的 vendor 包下
2、Golang 應(yīng)用打包 docker 鏡像:
參考文章 Gin實(shí)踐 連載九 將Golang應(yīng)用部署到Docker
3、推送鏡像到線上部署
那么你首先要把你打包好的鏡像給上傳到鏡像庫(kù),才能夠達(dá)到 pull 到 生產(chǎn)環(huán)境
(打包本地鏡像 -》 上傳遠(yuǎn)程鏡像庫(kù) -》 從遠(yuǎn)程鏡像庫(kù)拉取所需鏡像)
大致思路如上,跟著查和做就可以解決你的問(wèn)題了
建議去學(xué)習(xí)一下sftpfs庫(kù),獲取方式如下:
go get github.com/spf13/afero/sftpfs
這些現(xiàn)成的庫(kù),可以免去你的很多工作。
是不是我只有一臺(tái)服務(wù)器就沒(méi)有必要用rpc?
不是的, 你裝的操作系統(tǒng)進(jìn)程間通信大量的大用rpc技術(shù),因?yàn)楫?dāng)軟件復(fù)雜到一定程度時(shí)需要通過(guò)模塊化解耦,便于分別升級(jí)維護(hù),便于團(tuán)隊(duì)開(kāi)發(fā)。
rpc是不是要可以用于遠(yuǎn)程的客戶端服務(wù)器通信?
可以的,http-rpc了解下。處理好現(xiàn)在的微服務(wù)也是類似的概念,需要做的是處理好安全,和流量管理的問(wèn)題,這些都有現(xiàn)成的方案。問(wèn)題是哪種技術(shù)更適合。
rpc是否可以跨語(yǔ)言?
當(dāng)然沒(méi)問(wèn)題,跨平臺(tái)跨語(yǔ)言的早就發(fā)明出來(lái)了。但如果用同一種語(yǔ)言的序列化方式,顯然會(huì)更方便也效率更高,成本更低,前提是你沒(méi)有跨語(yǔ)言的要求。
可以從「先優(yōu)化數(shù)據(jù)結(jié)構(gòu)」再「查找」方向思考。
真實(shí)場(chǎng)景下,300w 條的數(shù)據(jù)量,可以考慮引入數(shù)據(jù)庫(kù)了
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國(guó)家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
北大課工場(chǎng)是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國(guó)家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國(guó)制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國(guó)職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開(kāi)發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_(kāi)發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開(kāi)發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開(kāi)發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開(kāi)發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。