首先建立一个exec.Cmd类型的值,然后执行这个类型的Start方法就可以启动命令了,获取此命令的输出管道,这个管道类型是io.ReadCloser,通过管道获取输出内容。 package mainimport ( "bytes" "fmt" "io" "os/exec")func main() { cmd0 := exec.Command("echo", "-n", "my fir
在 import "C" 语句前的注释中可以通过 #cgo 语句设置编译阶段和链接阶段的相关参数。编译阶段的参数主要用于定义相关宏和指定头文件检索路径。链接阶段的参数主要是指定库文件检索路径和要链接的库文件。 // #cgo CFLAGS: -DPNG_DEBUG=1 -I./include// #cgo LDFLAGS: -L/usr/local/lib -lpng// #include &l
如果CGO中引入的C/C++资源有代码而且代码规模也比较小,直接使用源码是最理想的方式,但很多时候我们并没有源代码,或者从C/C++源代码开始构建的过程异常复杂,这种时候使用C静态库也是一个不错的选择。静态库因为是静态链接,最终的目标程序并不会产生额外的运行时依赖,也不会出现动态库特有的跨运行时资源管理的错误。不过静态库对链接阶段会有一定要求:静态库一般包含了全部的代码,里面会有大量的符号,如果不
在Go语言中访问C语言的符号时,一般是通过虚拟的“C”包访问,比如C.int对应C语言的int类型。有些C语言的类型是由多个关键字组成,但通过虚拟的“C”包访问C语言类型时名称部分不能有空格字符,比如unsigned int不能直接通过C.unsigned int访问。因此CGO为C语言的基础数值类型都提供了相应转换规则,比如C.uint对应C语言的unsigned int。 package
在go语言中如何调用自己写的c函数? 1、首先我们先建立c语言的函数,建立文件out.c #include <stdio.h>void out(const char* s) { puts(s);}这个文件有一个out函数,就是输出传入的字符串。 2、建立go语言来调用out.c这个文件 package main//void out(const char* s);import
cgo可以认为是在go语言中调用c程序,或者在c程序中调用go程序。我们先看一个最简单例子 package mainimport "C"func main() { println("hello")}比普通的go程序多了一行import "C",但是我们发现虽然启动了cgo特性,但是实际上我们并没有使用它,并且还不会报错。但是编译的时候需要用到gcc编译器。 那如何在go文件中执行c的方法呢
在go语言中,nil是一个零值,如果我们在声明整数的时候没有为变量赋值,那么该整数的值默认是0,如果是一个指针没有明确的指向,它的值就是nil,除了指针,nil还标识切片、映射和接口的零值。 如果对一个指针进行解引用程序会崩溃 var abc *intfmt.Println(*abc)为了避免程序崩溃,需要通过对nil判断进行避免 if(abc != nil){ fmt.Println(
go的指针采用了c语言指针的语法,我们需要特别关注&和*,&表示地址操作符,可以得到指定变量的内存地址。 abc := 10fmt.Println(&abc)打印出来的是abc的地址,我们可以通过在变量前面加*对其进行解引用 fmt.Println(*abc)打印出来是10 指针类型可以跟其他普通类型一样,出现在所有需要用到类型的地方,如变量声明、函数形参、返回值类型、
可以将函数赋值给变量,可以将函数传递给函数,甚至可以编写创建并返回函数的函数。 func add() int { return 1 + 1}adds := addfmt.Println(adds())调用函数的时候需要用到圆括号,单这次的程序在赋值的时候并没有这样做,这里把add()赋给变量adds,通过adds()来调用函数。adds变量的类型是函数,具体来说就是一个不接收任何形参并且只
go语言的类型不能混合使用 fmt.Println("abc" + 1)会报字符串和整数不能这么操作 se := 12.0wu := 5fmt.Println(se * wu)(mismatched types float64 and int)一个是float一个是int不允许操作 例如上面,我们需要把wu这个变量类型转换为float64. fmt.Println(se * float64(
go语言拥有两种浮点类型,一种是float64,每个64位的浮点数需要占用8字节,另一种是float32,占用4字节。 var p = 3.54fmt.Printf("%T",p)输出float64,也就是默认浮点数是float64,如果想定义float32,需要明确指定。 如果不为float64赋值,默认就是0.0。 下面的浮点数的格式化输出,%4.2f中4代表总宽度,这里需要注意,点也算宽度
计算机编程经常需要权衡利弊,做相应的取舍,例如浮点数可以存储任意大小的数字,但是会不精确,整数虽然准确,但是取值范围受到限制。go中有个big包可以存储大数据,big.Int存储整数,big.Float存储浮点数,big.Rat存储分数。 创建big.Int使用NewInt函数 abc := big.NewInt(54232432)cde := big.NewInt(43222233)但是如果数
go提供了10种类型用于表示整数,由于每种整数类型的取值福范围不同,所以应该根据场景所需的范围来决定使用何种整数类型。 还有2个是int和uint,这2个类型是根据计算机架构自动选择合适的位长。在32位机器上就是32位值,在64位机器上就是64位值。 可以使用Printf函数的&T来查看变量的类型 abc := 43223fmt.Printf("type %T for %v\n",abc
日志采用第三方库github.com/sirupsen/logrus package loggerimport ( "path" "time" "github.com/lestrrat-go/file-rotatelogs" "github.com/rifflock/lfshook" "github.com/sirupsen/logrus")var Log = logrus.New()f
通过点击导出按钮把单据内容全部导出到excel中,先添加路由 r.HandleFunc("/cusexcel", web.Cusexcel)通过web.Cusexcel方法进行导出 func Cusexcel(w http.ResponseWriter, r *http.Request) { cutomers, _ := dbdata.Cuslist() f := excelize.New
把添加过的信息通过列表展示到页面,先添加路由 r.HandleFunc("/cuslist", web.Cuslist)执行web.Cuslist方法进行数据库查询,这里使用的是页面分页,所以数据库直接把全部数据查询出来。 func Cuslist(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type",
通过id删除一条记录,先添加路由 r.HandleFunc("/cusdel", web.Cusdel)通过web.Cusdel方法进行删除 func Cusdel(w http.ResponseWriter, r *http.Request) { r.ParseForm() ids := r.Form["id"] id, _ := strconv.Atoi(ids[0]) dbdat
通过id查询出单据的详细信息并在页面显示 需要先设置路由才能通过地址访问到需要的方法 r.HandleFunc("/cusinfo", web.Cusinfo)访问web.Cusinfo进行查询并转向页面 func Cusinfo(w http.ResponseWriter, r *http.Request) { t, _ := template.ParseFiles("templates
选中已经保存的信息,点修改后展示原来的内容,在此基础上进行修改内容,保存会把新修改的内容存入数据库。 先把路由加上 r.HandleFunc("/cuseditinit", web.Cuseditinit)r.HandleFunc("/cusedit", web.Cusedit)一个是进入编辑页面,一个是编辑保存动作 func Cuseditinit(w http.ResponseWriter,
这里就不再输入原密码,只是输入2遍新密码。首先在路由加入 r.HandleFunc("/upwinit", web.Upwinit)r.HandleFunc("/upw", web.Upw)一个是进入修改页面,一个是修改动作。 func Upwinit(w http.ResponseWriter, r *http.Request) { t, _ := template.ParseFile
token用于验证用户是否登录或者说有权限进行操作。当访问一个需要登录才能操作的功能,应该提示没有权限或者调转到登录页。 1、先说登录成功后生成token 先安装第三方库github.com/golang-jwt/jwt 下面是生成token的方法,uservo参数用于存储自定义的内容。jwt.SigningMethodHS256代表的是加密算法,exp是到期时间,iat是起止时间,appKey是
数据库密码一般是加密存储的,这里使用md5进行加密,md5加密是一种不可逆的加密算法,不可逆加密算法的特征是加密过程中不需要使用密钥,输入明文后由系统直接经过加密算法处理成密文,这种加密后的数据是无法被解密的,只有重新输入明文,并再次经过同样不可逆的加密算法处理,得到相同的加密密文并被系统重新识别后,才能真正解密。 用户登录时,前端传递原始密码,在后台把原始密码进行md5加密后和数据库进行比对,用
1、首先在templates文件夹下建立login.html。 <form class="form form-horizontal" action="/login" method="post"> <div class="row cl"> <label class="form-label col-xs-3"><i class="Hui-iconfo
1、建立数据库cus,建表user,四个字段id,username:登录名,password:密码,realname:真实姓名,id字段是自增长,其他都是字符串。 2、建表customer,有id,name:名称,taxno:税号,addr:地址,contact:联系人,contel:电话,content:备注,addtime:添加时间这几个字段,id也是自增长。 3、安装mysql包 go ge
通过前一段的学习,使用GO做了一个小例子,功能主要是登录,客户表的增删改查和导出excel,功能很小,但是基本上能够进行实战操作。数据库采用mysql,首先说搭建开发环境。 1、先安装GO,我使用的是1.19的windows安装版。 2、下载开发工具LiteIDE。 这个工具用着还挺方便,就是里面的功能好多不会用 3、搭建框架,创建代码目录cus,所有的项目文件就放到cus目录中。先建立go.mo
中间件主要是指可以拦截http请求,对到达请求之前进行一些处理,如数据处理,权限控制,认证等。 r := gin.Default(),默认自带Logger(), Recovery()全局作用了两个中间件。如果不想使用这2个中间件,可以使用r := gin.New()。 中间件写法,返回的是gin.HandlerFunc func RequestInfos() gin.HandlerFunc {
1、以[]byte方式返回 func main() { r := gin.Default() r.Handle("GET", "/hello", func(context *gin.Context) { context.Writer.Write([]byte("hello,")) }) r.Run()}2、以string方式返回结果 func main() { r := gin
1、绑定GET请求参数 type Person struct { Name string `form:"name"` Age int `form:"age"`}需要先定义一个结构体用于和参数进行对应,这里的form后面对应的就是参数名 func main() { r := gin.Default() r.Handle("GET", "/hello", func(cont
1、使用通用的Handle方法 r := gin.Default() r.Handle("GET", "/hello", func(context *gin.Context) { name := context.DefaultQuery("name", "默认值") fmt.Println(name) context.Writer.Write([]byte("hello," + name
Copyright © 2005-2025 51CTO.COM 版权所有 京ICP证060544号