Go的避坑指南

go的web开发

go的环境搭建

下载编译器(略)

配置环境变量

① 是项目文件存放路径

②编译器路径,配置好GOROOT后path环境变量中加入%GOROOT%\bin

若成功

 进入GOPATH目录创建项目

为了能在国内网络环境下正常的安装go开发工具包,你需要做如下的操作,打开cmd,执行2条命令:go env -w GO111MODULE=on

若出现以上错误,执行以下命令: 

go env -w GOPROXY=https://goproxy.cn,direct

package main

import (
	"html/template"
	"log"
	"net/http"
)

// 定义"/hello" 请求处理函数
func helloHandler(writer http.ResponseWriter, request *http.Request) {
	writer.Write([]byte("启航,go"))
	method := request.Method
	println(method)
	url := request.URL
	values := url.Query()
	username := values.Get("userN")
	password := values.Get("passW")
	println(username, password)
}

// 定义"/world" 请求处理器函数
func worldHandler(writer http.ResponseWriter, request *http.Request) {
	writer.Write([]byte("go web world"))
	// 获取请求方式
	method := request.Method
	println("请求方式", method)
	if request.Method == "GET" {
		t, _ := template.ParseFiles("login.html")
		t.Execute(writer, nil)
	} else {
		// 解析post url 参数
		url := request.URL
		values := url.Query()
		userName := values.Get("userName")
		password := values.Get("password")
		println(userName, password)

		// 解析表单参数
		request.ParseForm()
		userName1 := request.Form.Get("userName1")
		password1 := request.Form.Get("password1")
		println(userName1, password1)

	}
}
func main() {
	//为""/hello" 路由绑定处理器函数
	http.HandleFunc("/hello", helloHandler)
	// 为"/world"路由绑定处理器函数
	http.HandleFunc("/login", worldHandler)
	//启动服务并监听8090端口
	//err := http.ListenAndServe("localhost:8090", nil)
	var err = http.ListenAndServe("localhost:8090", nil)
	log.Fatal(err)
}

 同目录下创建html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>go的测试</title>
</head>
<body>
    <form action="http://localhost:8090/login" method="post">
        用户名:<input type="text" name="userName1"/>
        密码:<input type="password" name="password1"/>
        <input type="submit" value="登录">
    </form>

</body>
</html>

 启动

//启动
go run xxmain.go
//打包
go build xxmain.go

go下载第三方包

go get github.com/go-redis/redis/v8

最近访问github很慢,可以先设置一下代理

go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.io,direct

go连接mysql增删改查

package main

import (
	"database/sql"
	"fmt"
	"html/template"
	"log"
	"net/http"

	_ "github.com/go-sql-driver/mysql"
)

var (
	id    string
	name  string
	age   string
	email string
	sex   string
)

// 定义"/hello" 请求处理函数
func helloHandler(writer http.ResponseWriter, request *http.Request) {
	writer.Write([]byte("启航,go"))
	method := request.Method
	println(method)
	url := request.URL
	values := url.Query()
	username := values.Get("userN")
	password := values.Get("passW")
	println(username, password)
}

// 定义"/world" 请求处理器函数
func worldHandler(writer http.ResponseWriter, request *http.Request) {
	writer.Write([]byte("go web world"))
	// 获取请求方式
	method := request.Method
	println("请求方式", method)
	if request.Method == "GET" {
		t, _ := template.ParseFiles("login.html")
		t.Execute(writer, nil)
	} else {
		// 解析post url 参数
		url := request.URL
		values := url.Query()
		userName := values.Get("userName")
		password := values.Get("password")
		println(userName, password)

		// 解析表单参数
		request.ParseForm()
		userName1 := request.Form.Get("userName1")
		password1 := request.Form.Get("password1")
		println(userName1, password1)

	}
}
func main() {

	//为""/hello" 路由绑定处理器函数
	// http.HandleFunc("/hello", helloHandler)
	// 为"/world"路由绑定处理器函数
	// http.HandleFunc("/login", worldHandler)
	//启动服务并监听8090端口
	//err := http.ListenAndServe("localhost:8090", nil)
	// var err = http.ListenAndServe("localhost:8090", nil)
	// log.Fatal(err)
	db, err := sql.Open("mysql", "root:xdn123@tcp(127.0.0.1:3306)/xdn?charset=utf8")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer db.Close()
	//sqlselect(db)
	//insert(db)
	//delete(db)
	update(db)
}

// 查询 数据
func sqlselect(db *sql.DB) {
	rows, err := db.Query("select id,name,age,email from user")
	if err != nil {
		fmt.Println("数据库查询出错执行出错")
	}
	for rows.Next() {
		//按表名的顺序读取参数
		err := rows.Scan(&id, &name, &age, &email)
		if err != nil {
			log.Fatal(err)
		}
		fmt.Println(id, name, age, email)
	}
	rows.Close()
}

// 插入
func insert(db *sql.DB) {
	result, err := db.Exec("INSERT user (id,name,age,email) VALUES (?,?,?,?)", "6", "苏日瑞", 22, "test@qq.com")
	if err != nil {
		fmt.Println("数据库执行插入出错", err)
		return
	}
	changelow, err := result.RowsAffected()
	if err != nil {

	}
	fmt.Println("共计", changelow, "行受到影响")
}

// 删除第5条数据
func delete(db *sql.DB) {
	result, err := db.Exec("DELETE FROM user WHERE `Id` = ?", 1551481265541181442)
	if err != nil {
		fmt.Println("数据库执行删除出错", err)
		return
	}
	changelow, err := result.RowsAffected()
	if err != nil {

	}
	fmt.Println("共计", changelow, "行受到影响")
}

// 更新
func update(db *sql.DB) {
	result, err := db.Exec("update user set name = '开林' WHERE user.Name=?", "hhh")
	if err != nil {
		fmt.Println("数据库执行更新出错")
	}
	changelow, err := result.RowsAffected()
	if err != nil {
	}
	fmt.Println("共计", changelow, "行受到影响")
}

数据结构如下:

 Go解析16进制单精度浮点数到10进制

import (
    "math"
)

func hexToFloat32(hexStr string) float32 {
    var num uint32
    _, err := fmt.Sscanf(hexStr, "%x", &num)
    if err != nil {
        panic("Invalid hex string")
    }

    // 将 uint32 转换成 []byte,这里使用大端字节序
    b := []byte{
        byte(num >> 24),
        byte(num >> 16),
        byte(num >> 8),
        byte(num),
    }

    // 按照 IEEE 754 标准解析二进制数
    sign := int(b[0]>>7) & 1
    exponent := int(b[0]&0x7f)<<1 | int(b[1]>>7)
    mantissa := uint32(b[1]&0x7f)<<16 | uint32(b[2])<<8 | uint32(b[3])

    // 计算 10 进制值
    f := math.Pow(-1, float64(sign)) * (1 + float64(mantissa)/8388608) * math.Pow(2, float64(exponent)-127)

    return float32(f)
}

Go连接sqlserver增删改查之坑点

坑点1 

_ "github.com/denisenkom/go-mssqldb"包的db.Exec()函数无法动态传参,报错如下:

 解决:使用_ "github.com/mattn/go-adodb"驱动包windows系统可以正常增删改查操作

但是 _ "github.com/denisenkom/go-mssqldb"这个驱动在linux系统可以正常使用 

坑点2

虽然使用_ "github.com/mattn/go-adodb"驱动包可以正常增删改查操作,但是表名后要写字段名,否则报类型不匹配错误。

 go的定时任务

"github.com/go-co-op/gocron" #第一步 导包
func forgetVlue(){

  //定时执行的业务写在此处

} 

func main (){
  timezone, _ := time.LoadLocation("Asia/Shanghai")
	s := gocron.NewScheduler(timezone)

	// 每10秒执行一次
	s.Every(10).Seconds().Do(func() {
		go forgetVlue()
	})

	// 每秒执行一次
	// s.Every(10).Second().Do(func() {
	//     go cron2()
	// })

	s.StartBlocking()
}

引入暂时不用的包,可用如下写法

 日期格式化只能写固定时间

t := time.Now()
	timex := t.Format("2006-01-02 15:04:05")
	//f_t := "dddd"
	t1, err := time.Parse("2006-01-02 15:04:05", timex)

Gin的简单结构

第一步 引包

第二步 如下 

Gin使用结构体返回json数据,首字母要大写,否则返回的对象为空。 

Go打包到linux可执行文件

chmod 777 xxx #加权限
cat /etc/profile #配置文件的路径
#linux中配置go的开发环境
export GOROOT=/xdnsafe/Go/gohome/go  <---------go的安装目录
export GOPATH=/xdnsafe/Go/gopath     <---------go的项目目录

export PATH=$PATH:$GOROOT/bin

#配置完成后更新配置
source /etc/profile

①执行go env -w GO111MODULE=on

②执行go env -w GOPROXY=https://goproxy.io,direct

后台启动

setsid ./xxx  #后台启动
ps -ef | grep xxx   #查看是否成功
如下:
root     1809029       1  0 10:15 ?        00:00:00 ./sqldb
root     1809043 1797845  0 10:16 pts/276  00:00:00 grep --color=auto sqldb

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值