互通基础篇:C# 结合 Golang 开发
1. Go 项目结构推荐
【参考资料】Go 项目结构推荐
在一开始搭建 Go 项目时,就使用推荐的目录结构方式,可以让项目结构更清晰,互通性增强,从而也增强项目的可阅读性。
/cmd
项目主要应用文件(/cmd/myapps),保持文件与项目生成可执行文件名称相同,通常是较简单的main.go文件调用/internal和/pkg代码
/internal
项目内部调用文件,包含应用私有代码(/internal/app/myapps),应用通过代码(/internal/pkg/myprivlibs)
Standard Go Project Layout
2. GO 加解密相关
【参考资料】Des、Rsa加解密互通系列之Golang 实现
【参考资料】Go 实现 DES 加密和解密一些知识要点
3. POST 参数生成
参考资料】golang使用http client发起get和post请求示例
3.1 拼接 application/x-www-form-urlencoded
的 post 字符串
可以使用以下方式:
var r http.Request
r.ParseForm()
r.Form.Add("uuid", "aaaaaaaa&lasf=aaa")
bodystr := strings.TrimSpace(r.Form.Encode())
3.2 关键写法
resp, err := http.Post("http://www.01happy.com/demo/accept.php",
"application/x-www-form-urlencoded",
strings.NewReader(bodystr))
req, err := http.NewRequest("POST", "http://www.01happy.com/demo/accept.php", strings.NewReader(bodystr))
3.3 具体方法
//发送GET请求
//url:请求地址
//response:请求返回的内容
func Get(url string) (response string) {
client := http.Client{Timeout: 5 * time.Second}
resp, error := client.Get(url)
defer resp.Body.Close()
if error != nil {
panic(error)
}
var buffer [512]byte
result := bytes.NewBuffer(nil)
for {
n, err := resp.Body.Read(buffer[0:])
result.Write(buffer[0:n])
if err != nil && err == io.EOF {
break
} else if err != nil {
panic(err)
}
}
response = result.String()
return
}
//发送POST请求
//url:请求地址,data:POST请求提交的数据,contentType:请求体格式,如:application/json
//content:请求放回的内容
func Post(url string, data interface{}, contentType string) (content string) {
jsonStr, _ := json.Marshal(data)
reader := bytes.NewBuffer(jsonStr)
switch data.(type) {
case string:
reader = bytes.NewBufferString(data.(string))
fmt.Println(data.(string))
}
req, err := http.NewRequest("POST", url, reader)
req.Header.Add("content-type", contentType)
if err != nil {
panic(err)
}
defer req.Body.Close()
client := &http.Client{Timeout: 5 * time.Second}
resp, error := client.Do(req)
if error != nil {
panic(error)
}
defer resp.Body.Close()
result, _ := ioutil.ReadAll(resp.Body)
content = string(result)
return
}
4. 一些小知识点
map 作 json 功能
func BaseResultJson(errCode int, errMsg string) map[string]interface{} {
m := make(map[string]interface{})
m["err_code"] = errCode
m["err_msg"] = errMsg
return m
}
m := common.BaseResultJson(101, "请求失败!")
j, _ := json.Marshal(m)
fmt.Println(string(j))
Go DLL 中的异常得自己处理,否则会导致程序崩溃(闪退)。
func TrialDefer() (content string) {
defer func() {
if r := recover(); r != nil {
fmt.Println(r)
m := common.BaseResultJson(101, "请求失败!")
j, _ := json.Marshal(m)
content = string(j)
}
}()
var r http.Request
r.ParseForm()
timeStr := time.Now().Format("20060102")
r.Form.Add("timeStr", timeStr)
bodystr := strings.TrimSpace(r.Form.Encode())
content = Post("http://www.sag.xcom/xxx", bodystr, "application/x-www-form-urlencoded")
return
}
有疑问加站长微信联系(非本文作者)
本文来自:简书
感谢作者:更多精彩内容学习笔记6molscar[译] Go 项目结构规范GotaX【转载】Golang资料集Go最新资料汇总链接更改Golang语言社区Golang资料集Go最新资料汇总链接更改Albert陈凯GO Plugin 编译问题唐西铭
查看原文:C# 与 Go 的互通代码笔记