GO-口吐芬芳
最近有个项目要用socket做前后端交互, 看到 go websocket 居然支撑 单服务器100 0000 连接.内存不用1G. 它滴娘个腿~
对于我们这种用java 写个socket,发布到神龙服务器上开一百个线程就卡到飞起的三流程序员来说,天神有木有!!!
也算是老司机,不曾想有一天拔在这鬼坑里出不来.*** ,就不能简单暴力点?
开篇-环境-MAC
我的环境 mac,其它环境别往下看了,鬼知道你是什么问题!自己爬去,我都没爬出来还管球你!
下载
官网, 下载
我下的版本是 Apple MacOS / go1.14.darwin-amd64.pkg
一顿鼠标Next 之后, go 成功安装到 /usr/local/go
我一直坚信这**是我整个GO环节里最顺利的时刻
环境变量
因为 shell 环境用的 zsh, 确保 开机在命令行就可以用到 GO 命令 , PATH。这个跟其它系统、其它应用可执行文件一个意思,不嘚嘚。
没安装zsh 这里
启动台》其它》终端
code@MB ~ % vi ~/.bash_profile
export GOPATH=$HOME/go
export GOPROXY=https://goproxy.io
export GO111MODULE=auto
export PATH=$PATH:/usr/local/go/bin
export PATH=$PATH:$GOPATH
> esc :wq
# 如果有权限问题, 就 sudo vi ...
# 为了上面这堆环境变量我没少折腾 你照抄好了。
vi ~/.zshrc
source $HOME/.bash_profile
esc wq
> source ~/.zshrc # 刷新整个配置,这个之后应该在什么位置都可以 go help
> go help
> ...
IDE 编程工具
在 Visual Studio Code 如日中天的今天,其它都是垃圾!反正我写java、node、flutter什么乱七八糟的都用这个.
下载完成后在 Extensions 里搜 GO ,管它什么牛鬼蛇神,看着顺眼的都一通 install! 最少得装top两,当程序员打开任何界面不能空手点XX,横竖捞点。
然后
Code 》 Preferences 》Settings 》 User(作用域) 》 Extensions 》Go
Edit in settings.json, 下面这段复制进去. 重启 VS Code 一次。
"go.formatTool": "goimports",
"go.useLanguageServer": true,
"go.gocodeAutoBuild": true,
"go.gopath": "/Users/codes/go",
"[markdown]": {
"editor.defaultFormatter": "yzhang.markdown-all-in-one"
},
"go.languageServerFlags": [
"serve",
"-rpc.trace",
"--debug=localhost:6060",
]
自己看字面意思,懒得注释!
反正为了能正常编译,这几个配置翻了一堆网页,烧了我三杯速溶咖啡,个中艰辛尔等自行理解!鬼知道还有什么大坑,后面慢慢补充。
项目创建
相对于JAVA/maven,Node/NPM来说,GO的依赖管理不知道是什么goshi!总之第一感觉就是思路清奇、逻辑混乱。搞明白估计得不少时间。
有用文字能描述清楚的大神,请直接提交到这里,插香跪拜!
我们用官方提供的mod来管理依赖
创建了个目录。用来踩坑
> mkdir -p ~/git/projects/go/hello
> cd ~/git/projects/go/hello
> go mod init
初始化mod管理依赖项目环境方式,跟环境变量里的 export GO111MODULE=auto 相关。
这里 有说明,但是我看完实操还是云里雾里。
VS Code》File》Open 上面创建的目录。
主命令文件
新建 main.go 》F5
package main
import (
"io"
"net/http"
"os/exec"
)
func hello(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "hello this boll chat server! $9999")
}
func main() {
http.HandleFunc("/", hello)
http.ListenAndServe(":8000", nil)
cmd := exec.Command("open", "http://localhost:8000")
cmd.Output()
}
good luck !!!