go语言 c# 混合编程 pdf,C# 与 Go 的互通代码笔记

1. Go 项目结构推荐

【参考资料】Go 项目结构推荐

在一开始搭建 Go 项目时,就使用推荐的目录结构方式,可以让项目结构更清晰,互通性增强,从而也增强项目的可阅读性。

/cmd

项目主要应用文件(/cmd/myapps),保持文件与项目生成可执行文件名称相同,通常是较简单的main.go文件调用/internal和/pkg代码

/internal

项目内部调用文件,包含应用私有代码(/internal/app/myapps),应用通过代码(/internal/pkg/myprivlibs)

Standard Go Project Layout

2. GO 加解密相关

3. 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

}

有疑问加站长微信联系(非本文作者)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值