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

 

posted @ 2018-07-03 17:34  warnet  阅读(258)  评论(0编辑  收藏  举报