• go语言简单服务入门示例


    学习了一下go语言的基本语法,实现了一个简单的http服务,监听两个路径 http://your_host:your_port/get 和 http://your_host:your_port/post ,接收请求后做校验,并将数据返回给请求端,都以json通讯。

    示例代码如下(已经测试通过):

    package main // 包名称,一个目录下,只能有一个名称为main的package
    
    import ( // 需要引入的包,包的顺序无所谓,但是如果环境里没有,就会报错
    	"fmt"
    	"log"
    	"net/http"
    	"encoding/json"
    	"io/ioutil"
    )
    
    type myresp struct { // 定义结构体
    	Id int `json:"id"` // 反引号里的内容是要在json编码时,导出到json里的内容,字段的首字母必须要大写
    	Name string `json:"name"`
    	Behave []string `json:"behave"`
    }
    
    type Intelinfo struct {
    	Code int `json:"code"`
    	Msg string `json:"msg"`
    }
    
    func index(w http.ResponseWriter, r *http.Request) {
    	_resp := myresp { // 定义一个返回的结构体,注意实例时,需要有冒号和逗号,而定义时没有的
    		Id: 123,
    		Name: "test_name",
    		Behave: []string{"behave1", "behave2", "behave3"}, // 注意数组的初始化方式
    	}
    	// fmt.Println(_resp) // 注释是不会执行的
    	bjson, jerr := json.Marshal(_resp) // 需要注意 := 仅仅用于在函数内部初始化之前没有定义或声明过的变量,并且如果下文未使用,会报错
    	// fmt.Println(bjson)
    	if jerr != nil { // if 语句没有括号,这个需要注意
    		fmt.Println("json.Marshal_err:", jerr)
    	}
    	w.Header().Set("Content-Type", "application/json") // 设置响应的包头
    	fmt.Fprintf(w, string(bjson))
    }
    
    func handle_service_info(w http.ResponseWriter, r *http.Request) {
    	var bjson string // 声明一个函数中的全局变量
    
    	/*
    	 * 注意map的用法 map[your_type]your_type_with_no_space_after_bracket
    	 * 但是这样初始化有问题,因为值可能是值类型,而不是string
    	 */
    	var user map[string]string
    
    	body, _ := ioutil.ReadAll(r.Body)
    	unmar_err := json.Unmarshal(body, &user)
    	if unmar_err != nil {
    		bjson = "decode json error"
    	} else {
    		if (user["username"] == "test" && user["password"] == "test") { // if 也可以加上括号
    			_resp := Intelinfo {
    				Code: 0,
    				Msg: "ok",
    			}
    			mjson, jerr := json.Marshal(_resp) // 这里mjson只是为了暂存一下decode的结果
    			// fmt.Println(bjson)
    			if jerr != nil {
    				fmt.Println("json.Marshal_err:", jerr)
    			}
    			w.Header().Set("Content-Type", "application/json")
    			bjson = string(mjson) // decode的结果在给到之前声明过的变量
    		} else {
    			bjson = "username & password error"
    		}
    	}
    
    	fmt.Fprintf(w, string(bjson)) // func origin format: func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error)
    }
    
    func main() {
    	http.HandleFunc("/get", index) // 配置监听的路由
    	http.HandleFunc("/post", handle_service_info) // 配置监听的路由
    
    	err := http.ListenAndServe(":9191", nil) // 监听的端口
    	if err != nil {
    		log.Fatal("ListenAndServe:", err)
    	}
    }
    

      执行方式: go run the_name_you_save_the_upper_code_for.go

  • 相关阅读:
    分布式缓存系统Memcached
    HTTP(GET/POST)请求过程中的编码问题
    将指定的Json字符串转为指定的T类型对象(转帖)
    Linux 中有几个文件压缩和解压缩工
    策略添加-通过域策略组自动映射共享文件夹
    Centos 7 加AD域
    Gns3 模拟器创建VLAN
    防火墙常用命令
    Centos 6 任务计划配置
    Cenots 7 开启 SSH_远程连接
  • 原文地址:https://www.cnblogs.com/warnet/p/9259764.html
Copyright © 2020-2023  润新知