golang

分类下相关文章

golang 本地调试第三方库的代码

正在用的 golang 三方库 GoAdmin,发现有个时间区间组件的 bug。 时间组件无法切换 中文 locale 过滤功能无效。目前猜测是 locale 问题导致的日期格式问题 想自己调试一下看看能否解决。 但是如何调试呢? 首先,我是想直接修改 GOPATH/src 下的代码,然后重新编译。但是发现 > ls $GOPATH/src/github.com/GoAdminGroup/ 是空的。。。 解决方法 使用 go mod 替换源的方式: go mod edit -replace github.com/GoAdminGroup/go-admin=/home/zhongwe ...

阅读全文...

golang colly 爬取网站所有页面的标题

由于接手了一个年久失修的网站,其网页的标题,keyword,description 异常混乱,很多页面的标题都是相同的,或者非常长,填充了大量冗余的关键词。 网站的板块,独立页非常多,完全靠检查代码,或者检查页面,很难找全所有有问题的页面。 为了快速找出有问题的页面,我决定用 golang colly 写个爬虫,自动检测全站的标题等 SEO 设置。 hello world, colly 以豆瓣网站为例: package main import ( "fmt" "github.com/gocolly/colly" "github.com/ ...

阅读全文...

go install 的妙用

我之前一直对 go install 干了些什么不太了解。甚至分不清 go get 与 go install 的区别。 最近 golang 代码写的多了,接触的三方库多了,发现 go install 确实非常方便。 例如,GoAdmin 可以通过 go install github.com/GoAdminGroup/go-admin/adm 来安装一个 adm 工具,之后就可以通过 adm 命令来自动生成一些数据表相关的代码。类似 php artisan。 除了安装一些三方工具,我发现还可以来安装一些自己用 golang 写的小工具。 全局安装自己写的工具 例如,我写了一个导入日志的小工具 i ...

阅读全文...

golang 读取命令行参数

例如,我想用 golang 读取命令行传入的文件名,可以直接使用 os.Args。 package main import ( "fmt" "os" ) func main() { fmt.Println(os.Args) if len(os.Args) != 2 { fmt.Println("请输入文件名") return } fmt.Println(os.Args[1]) } 运行测试 > ./test baidu-realtime.csv [./test baidu-realtime.csv] ...

阅读全文...

如何组织 Golang 项目目录,使一个项目包含多个 main 入口程序

真实需求场景 例如,我在写一个分析百度统计实时访客历史记录的系统,其包含的基本模块: 一个 GoAdmin 写的 Web 管理后台服务 一个 CSV 数据文件导入 MySQL 的命令 测试项目根目录下是否可以共存两个 main 入口程序 先不管网上的那些 golang 代码组织策略,单纯的测试一下是否可以在项目根目录下共存两个 main 入口程序。 测试方法: 既有的 import_log.go 中已经有一个 main 函数了 新建一个 main.go 文件,与 import_log.go 同属 package main,包含一个简单的 main 函数,输出 Hello world 运 ...

阅读全文...

golang sql 插入时报错 Error 1292: Incorrect datetime value: '' for column at row 1

在解析百度统计实时访客 csv 文件时,会遇到上次访问时间为空的情况。 pre_access_at := "" if strings.HasPrefix(record[13], "2") { pre_access_at = record[13] } 这样在执行 SQL insert 操作时,会报错: Error 1292: Incorrect datetime value: '' for column 'pre_access_at' at row 1 而 golang 中 string 类型并不能被赋值为 nil。 即便使用 time.Ti ...

阅读全文...

golang 判断字符串是否以特定字符串为结尾

可以使用 golang 内置的 strings.HasSuffix 参数: 第一个参数是原字符串 第二个参数是结尾字符串 package main import ( "fmt" "strings" ) func main() { b := strings.HasSuffix("103s", "s") fmt.Println(b) // true b2 := strings.HasSuffix("103s", "golang") fmt.Pri ...

阅读全文...

golang 读取并解析 csv 文件

从百度统计后台导出并下载了实时访客的 CSV 文件。想本地解析一下,并导入到 MySQL 中做备份,因为百度统计只能保留两个周的历史数据,且上限为5000条。 golang 解析 csv 代码 这里用到了 golang 内置的 "encoding/csv" 库,能自动读取一行 csv 数据,并返回 slice 类型的数据。 package main import ( "encoding/csv" "fmt" iconv "github.com/djimenez/iconv-go" "io&quo ...

阅读全文...

GoAdmin 兼容低版本的 MySQL,Unknown character set: 'utf8mb4'

有一个历史悠久的服务,使用的是 MySQL 5.0 版本。我想用 GoAdmin 重写管理后台,但是 MySQL 又不敢停机升级。发布之后,运行报错: panic: Error 1115: Unknown character set: 'utf8mb4' goroutine 1 [running]: github.com/GoAdminGroup/go-admin/modules/db.(*Mysql).InitDB.func1() /home/zhongwei/golang/pkg/mod/github.com/!go!admin!group/go-admin@v1.2.9 ...

阅读全文...

数据表非 id 主键时,GoAdmin 报错 Error 1054: Unknown column 'category.id' in 'field list'

使用 GoAdmin 管理新建的分类表 category 的 CRUD 时,报错: Error 1054: Unknown column 'category.id' in 'field list' 而 category 的主键,没有使用默认的 id,而是自定义了一个名 c_id. 解决方法 替换生成的代码中的 categoryTable := table.NewDefaultTable(table.DefaultConfigWithDriver("mysql")) 为 categoryTable := table.NewDefaultTable(table.Confi ...

阅读全文...

GoAdmin 列表页指定字段的搜索过滤

GoAdmin 常用的几种搜索过滤方式: 精确查找 适合 ID,订单号等。代码示例: info.AddField("Id", "id", db.Int).FieldFilterable() 部分匹配 适合关键词查找。代码示例: info.AddField("Name", "name", db.Varchar). FieldFilterable(types.FilterType{Operator: types.FilterOperatorLike}) ...

阅读全文...

golang 换行报错:expected statement, found '.'

在写 golang 代码时,遇到一行代码过长,于是,我习惯性地参照 PHP 的折行写法: info.AddField("Name", "name", db.Varchar) .FieldFilterable(types.FilterType{Operator: types.FilterOperatorLike}) 但是 VIM 保存时,触发的 go fmt 报错: expected statement, found '.' 参考了一下 github 上开源项目的代码,原来逗点需要写在上一行。。。 info.AddField(" ...

阅读全文...

减小 golang build 编译后程序包的文件大小

在 Golang Gin 写的后台程序加上 GoAdmin 之后,go build 生成的发布包体积已经达到了 30M 之巨。上传阿里云服务器,以 400K/s 的传输速度得上传1分钟。 30075408 网上找到一个解决方案,加上编译参数: go build -ldflags "-s -w" 体积减小到了 23M。 22778576 文件大小降幅大约四分之一。 编译参数 -s 的作用是去掉符号信息。去掉符号表,golang panic 时 stack trace 就看不到文件名及出错行号信息了。 -w 的作用是去掉 DWARF tables 调试信息。结果就是 ...

阅读全文...

golang gin & nginx 获取访客的真实 IP

在 golang gin controller 中使用 c.ClientIP() 获取请求的 IP,但是获取到的是 127.0.0.1. 估计是 Nginx 在转发请求给 golang 时,没有配置好。 解决方法 增加两行配置即可。 location /go/ { proxy_set_header X-Forward-For $remote_addr; proxy_set_header X-real-ip $remote_addr; proxy_pass http://127.0.0.1:8080/go/; } reload nginx,测试 ...

阅读全文...

生产环境 GoAdmin 后台加载慢的问题

从 Chrome Network 里看,GoAdmin 加载了很多大的静态资源文件,例如 all_2.min.js 有 1.2M 之大。 更严重的是,GoAdmin 没有对静态资源文件做缓存设置,导致每次用浏览器打开,都需要重新拉取一遍全量的静态资源文件。而我的服务器带宽只有 1M,下载速度非常缓慢。 可以对比参考 Google 首页的处理方式: 解决方法一: GoAdmin 后台设置 CDN,参考 http://doc.go-admin.cn/zh/admin/cdn/ 但是这种方法,我并不打算使用。原因是: 更新 CDN 文件麻烦。每次版本升级,都需要对应的更新 CDN 文件。 由 ...

阅读全文...