zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Yield Usage Understanding
    Deadclock on calling async methond
    How to generate file name according to datetime in bat command
    Run Unit API Testing Which Was Distributed To Multiple Test Agents
    druid的关键参数+数据库连接池运行原理
    修改idea打开新窗口的默认配置
    spring boot -thymeleaf-url
    @pathvariable和@RequestParam的区别
    spring boot -thymeleaf-域对象操作
    spring boot -thymeleaf-遍历list和map
  • 原文地址:https://www.cnblogs.com/warnet/p/9259764.html
Copyright © 2011-2022 走看看