关于goland:Go-语言史诗级更新循环Bug修复

背景前两天 Golang 的官网博客更新了一篇文章:Fixing For Loops in Go 1.22 看这个题目的就是修复了 Go 循环的 bug,这真的是史诗级的更新;我身边接触到的大部分 Go 开发者都犯过这样的谬误,包含我本人,所以前两年我也写过相似的博客:简略的 for 循环也会踩的坑 先来简略回顾下应用应用 for 循环会碰到的问题: list := []*Demo{{"a"}, {"b"}} for _, v := range list { go func() { fmt.Println("name="+v.Name) }() } type Demo struct { Name string }预期的后果应该是打印 a,b,但理论打印的却是b,b。 Let's Encrypt: CAA Rechecking bug相似的问题连 mozilla 团队也没能幸免,所以也的确是一个十分常见的问题,这样的写法合乎大部分的开发者的直觉,毕竟其余语言这么应用也没有问题。 当然在现阶段要解决也很简略,要么就是在应用之前先复制一次,或者应用闭包传参: // 复制 list := []*Demo{{"a"}, {"b"}}  for _, v := range list {   temp:=v   go func() {    fmt.Println("name="+temp.Name)   }()  } // 闭包 list := []*Demo{{"a"}, {"b"}}  for _, v := range list {   go func(temp *Demo) {    fmt.Println("name="+temp.Name)   }(v)  }还好官网也意识到了这个问题:所以在 1.22 中咱们能够不必再写这个 v:=v这个多余的复制语句了,也不会呈现下面的问题。 ...

September 25, 2023 · 1 min · jiezi

关于goland:2023年Goland最新版下载激活教程亲测可用永久激活

GoLand破解装置激活最新教程(附破解工具及激活码)本文讲的是反对2022.3.2最新版本的GoLand破解、GoLand激活码、GoLand装置、GoLand永恒激活码的最新永恒激活教程,本文有mac和windows零碎的GoLand装置教程。 1.下载安装GoLand先去官网下载,我这里下载的是最新版本的2022.2.2,测试过2021以上的版本均可应用以下教程破解。 装置而后关上 我这里是全选 2.下载破解工具下载地址 windows的样子 2. mac的样子 关上scripts文件 3.windows的GoLand激活先执行unistall-current-user.vbs,间接双击关上,此步骤是为了避免之前有过激活信息,确保以后环境变量下没有激活工具的变量信息,可先执行卸载脚本在再进行前面的激活操作,防止激活失败。 呈现弹框done阐明胜利 而后再执行install-current-user.vbs,间接双击关上即可 这里须要期待10秒左右才会呈现第二个done弹框,才是胜利 而后再输出对应的激活码即可,文章下面扫公众号二维码获取JZFLGE21ND-eyJsaWNlbnNlSWQiOiJKWkZMR0UyMU5EIiwibGljZW5zZWVOYW1lIjoic2lnbnVwIHNjb290ZXIiLCJhc3NpZ25lZU5hbWUiOiIiLCJhc3NpZ25lZUVtYWlsIjoiIiwibGljZW5zZVJlc3RyaWN0aW9uIjoiIiwiY2hlY2tDb25jdXJyZW50VXNlIjpmYWxzZSwicHJvZHVjdHMiOlt7ImNvZGUiOiJQU0kiLCJmYWxsYmFja0RhdGUiOiIyMDI1LTA4LTAxIiwicGFpZFVwVG8iOiIyMDI1LTA4LTAxIiwiZXh0ZW5kZWQiOnRydWV9LHsiY29kZSI6IlBHTyIsImZhbGxiYWNrRGF0ZSI6IjIwMjUtMDgtMDEiLCJwYWlkVXBUbyI6IjIwMjUtMDgtMDEiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiUFdTIiwiZmFsbGJhY2tEYXRlIjoiMjAyNS0wOC0wMSIsInBhaWRVcFRvIjoiMjAyNS0wOC0wMSIsImV4dGVuZGVkIjp0cnVlfSx7ImNvZGUiOiJHTyIsImZhbGxiYWNrRGF0ZSI6IjIwMjUtMDgtMDEiLCJwYWlkVXBUbyI6IjIwMjUtMDgtMDEiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IlBDV01QIiwiZmFsbGJhY2tEYXRlIjoiMjAyNS0wOC0wMSIsInBhaWRVcFRvIjoiMjAyNS0wOC0wMSIsImV4dGVuZGVkIjp0cnVlfV0sIm1ldGFkYXRhIjoiMDEyMDIyMDkwMlBTQU4wMDAwMDUiLCJoYXNoIjoiVFJJQUw6LTE1NTI3NDEyNzIiLCJncmFjZVBlcmlvZERheXMiOjcsImF1dG9Qcm9sb25nYXRlZCI6ZmFsc2UsImlzQXV0b1Byb2xvbmdhdGVkIjpmYWxzZX0=-cQoXljKE7uBjoI23ZBPd84P89vQAaprVvVhxj1/nSOABUZKPZMCs6p2id5WKBP1n0EoPHykvzd0y7QcdcO2hxNwbaBRZxpPFuuMigGazrrt+zSd9+UlFXmtcseFTXlWn7Jw2qqp7WSVQlj+o3gf2Gic9/Vp2pAmIajMGdFDsXcHbYUrLwTRVtFkNtggtsqh0AVS8xhzLuXMzGXJsqEEWPZCKMEjy0bURm/FQvrRC/gIptJzuybSb/neqKmvxZefX1lhe98igS3tZsL/E+hsQK7ueXVSP2AuuVEz/6qHYknPS7K4UluWpd+ktIxTcHjIykK1tlWlwTsupZTxnvXFWQA==-MIIETDCCAjSgAwIBAgIBDTANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBMB4XDTIwMTAxOTA5MDU1M1oXDTIyMTAyMTA5MDU1M1owHzEdMBsGA1UEAwwUcHJvZDJ5LWZyb20tMjAyMDEwMTkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCUlaUFc1wf+CfY9wzFWEL2euKQ5nswqb57V8QZG7d7RoR6rwYUIXseTOAFq210oMEe++LCjzKDuqwDfsyhgDNTgZBPAaC4vUU2oy+XR+Fq8nBixWIsH668HeOnRK6RRhsr0rJzRB95aZ3EAPzBuQ2qPaNGm17pAX0Rd6MPRgjp75IWwI9eA6aMEdPQEVN7uyOtM5zSsjoj79Lbu1fjShOnQZuJcsV8tqnayeFkNzv2LTOlofU/Tbx502Ro073gGjoeRzNvrynAP03pL486P3KCAyiNPhDs2z8/COMrxRlZW5mfzo0xsK0dQGNH3UoG/9RVwHG4eS8LFpMTR9oetHZBAgMBAAGjgZkwgZYwCQYDVR0TBAIwADAdBgNVHQ4EFgQUJNoRIpb1hUHAk0foMSNM9MCEAV8wSAYDVR0jBEEwP4AUo562SGdCEjZBvW3gubSgUouX8bOhHKQaMBgxFjAUBgNVBAMMDUpldFByb2ZpbGUgQ0GCCQDSbLGDsoN54TATBgNVHSUEDDAKBggrBgEFBQcDATALBgNVHQ8EBAMCBaAwDQYJKoZIhvcNAQELBQADggIBABqRoNGxAQct9dQUFK8xqhiZaYPd30TlmCmSAaGJ0eBpvkVeqA2jGYhAQRqFiAlFC63JKvWvRZO1iRuWCEfUMkdqQ9VQPXziE/BlsOIgrL6RlJfuFcEZ8TK3syIfIGQZNCxYhLLUuet2HE6LJYPQ5c0jH4kDooRpcVZ4rBxNwddpctUO2te9UU5/FjhioZQsPvd92qOTsV+8Cyl2fvNhNKD1Uu9ff5AkVIQn4JU23ozdB/R5oUlebwaTE6WZNBs+TA/qPj+5/we9NH71WRB0hqUoLI2AKKyiPw++FtN4Su1vsdDlrAzDj9ILjpjJKA1ImuVcG329/WTYIKysZ1CWK3zATg9BeCUPAV1pQy8ToXOq+RSYen6winZ2OO93eyHv2Iw5kbn1dqfBw1BuTE29V2FJKicJSu8iEOpfoafwJISXmz1wnnWL3V/0NxTulfWsXugOoLfv0ZIBP1xH9kmf22jjQ2JiHhQZP7ZDsreRrOeIQ/c4yR8IQvMLfC0WKQqrHu5ZzXTH4NO3CwGWSlTY74kE91zXB5mwWAx1jig+UXYc2w4RkVhy0//lOmVya/PEepuuTTI4+UJwC7qbVlh5zfhj8oTNUXgN0AOc+Q0/WFPl1aw5VV/VrO8FCoB15lFVlpKaQ1Yh+DVU8ke+rt9Th0BCHXe0uZOEmH0nOnH/0onD 4.mac的GoLand激活先关上终端先运行uninstall.sh此步骤是一键帮你去掉以前所激活过留下的货色,解决key is invalid的问题。避免激活失败而后终端输出 sh /Users/chen23/Downloads/jihuo-tool/scripts/uninstall.sh 这里间接把uninstall.sh拖动到终端即可。记得mac运行是sh xxxxx去运行.sh文件(记得sh前面加空格加门路) 呈现done阐明胜利。 再执行install.sh,与下面同理,呈现done,the kill xxxxx 阐明胜利。 而后敞开GoLand,从新关上GoLand,输出破解码激活即可 而后就成了,工夫是假的,曾经永恒激活了,而且是官网最新版本哦,如果你从新更新了,再执行下面的操作即可。软件下载地址:PS: 破解补丁页面提取人数过多,导致分享的百度网盘链接容易被封:破解补丁分享失败蛋疼ing,为限度人数,目前暂不提供页面间接提取,改为从笔者公众号提取。 在微信公众号 【程序员徐师兄plus】,回复 goland 即可获取下载地址 下载地址

September 6, 2023 · 1 min · jiezi

关于goland:Nunu-助你快速构建高效可靠的Go应用

Nunu 是一个基于 Golang 的利用脚手架,它的名字来自于英雄联盟中的游戏角色,一个骑在雪怪肩膀上的小男孩。和努努一样,该我的项目也是站在伟人的肩膀上,它是由 Golang 生态中各种十分风行的库整合而成的,它们的组合能够帮忙你疾速构建一个高效、牢靠的应用程序。 我的项目主页:https://github.com/go-nunu/nunu 性能Nunu 采纳了多种风行的库,包含 Gin、Gorm、Wire、Viper、Zap、Golang-jwt、Go-redis、Testify、Sonyflake、robfig-cron 等等。这些库的组合能够帮忙你疾速构建一个高效、牢靠的应用程序。 个性Nunu 具备以下个性: 超低学习老本和定制:Nunu 封装了 Gopher 最相熟的一些风行库。你能够轻松定制应用程序以满足特定需要。高性能和可扩展性:Nunu 旨在具备高性能和可扩展性。它应用最新的技术和最佳实际,确保你的应用程序能够解决高流量和大量数据。安全可靠:Nunu 应用了稳固牢靠的第三方库,确保你的应用程序安全可靠。模块化和可扩大:Nunu 旨在具备模块化和可扩展性。你能够通过应用第三方库或编写本人的模块轻松增加新性能和性能。文档欠缺和测试齐备:Nunu 文档欠缺,测试齐备。它提供了全面的文档和示例,帮忙你疾速入门。它还包含一套测试套件,确保你的应用程序按预期工作。简洁分层架构Nunu 采纳了经典的分层架构。同时,为了更好地实现模块化和解耦,采纳了依赖注入框架 Wire。 文档Nunu 提供了全面的文档和示例,帮忙你疾速入门。它还包含一套测试套件,确保你的应用程序按预期工作。 要求要应用 Nunu,你须要在零碎上装置以下软件: Golang 1.16 或更高版本GitMySQL 5.7 或更高版本(可选)Redis(可选)装置你能够通过一行命令装置 Nunu: go install github.com/go-nunu/nunu@latest 创立新我的项目你能够应用以下命令创立一个新的 Golang 我的项目: nunu new projectName// ornunu new projectName -r https://github.com/go-nunu/nunu-layout-advanced.git成果预览: 此命令将创立一个名为 projectName 的目录,并在其中生成一个优雅的 Golang 我的项目构造。 .├── cmd│   ├── job│   ├── migration│   └── server│   ├── wire│   │   ├── wire.go│   │   └── wire_gen.go│   └── main.go├── config│   ├── local.yml│   └── prod.yml├── deploy├── internal│   ├── dao│   │   ├── dao.go│   │   └── user.go│   ├── handler│   │   ├── handler.go│   │   └── user.go│   ├── job│   │   └── job.go│   ├── middleware│   │   ├── cors.go│   │   ├── jwt.go│   │   ├── log.go│   │   └── sign.go│   ├── migration│   │   └── migration.go│   ├── model│   │   └── user.go│   ├── provider│   │   └── provider.go│   ├── server│   │   └── http.go│   └── service│   ├── service.go│   └── user.go├── pkg│   ├── config│   ├── helper│   ├── http│   └── log├── script├── storage├── test├── web├── LICENSE├── README.md├── README_zh.md├── go.mod└── go.sum这是一个经典的Golang 我的项目的目录构造,蕴含以下目录: ...

June 7, 2023 · 2 min · jiezi

关于goland:2023-GoLand-最新下载激活教程亲测有效永久激活

本文讲的是反对2022.3.2最新版本的GoLand激活、GoLand激活码、GoLand装置、GoLand永恒激活码的最新永恒激活教程,本文有mac和windows零碎的GoLand装置教程。 1.下载安装GoLand先去官网下载,我这里下载的是最新版本的2022.2.2,测试过2021以上的版本均可应用以下教程激活。 装置而后关上 我这里是全选 2.下载激活工具为了避免爬虫,因而 扫描关注微信公众号【徐公】获取,输出 GoLand 获取。 windows的样子 2. mac的样子 关上scripts文件 3.windows的GoLand激活先执行unistall-current-user.vbs,间接双击关上,此步骤是为了避免之前有过激活信息,确保以后环境变量下没有激活工具的变量信息,可先执行卸载脚本在再进行前面的激活操作,防止激活失败。 呈现弹框done阐明胜利 而后再执行install-current-user.vbs,间接双击关上即可 这里须要期待10秒左右才会呈现第二个done弹框,才是胜利 而后再输出对应的激活码即可,文章下面扫公众号二维码获取JZFLGE21ND-eyJsaWNlbnNlSWQiOiJKWkZMR0UyMU5EIiwibGljZW5zZWVOYW1lIjoic2lnbnVwIHNjb290ZXIiLCJhc3NpZ25lZU5hbWUiOiIiLCJhc3NpZ25lZUVtYWlsIjoiIiwibGljZW5zZVJlc3RyaWN0aW9uIjoiIiwiY2hlY2tDb25jdXJyZW50VXNlIjpmYWxzZSwicHJvZHVjdHMiOlt7ImNvZGUiOiJQU0kiLCJmYWxsYmFja0RhdGUiOiIyMDI1LTA4LTAxIiwicGFpZFVwVG8iOiIyMDI1LTA4LTAxIiwiZXh0ZW5kZWQiOnRydWV9LHsiY29kZSI6IlBHTyIsImZhbGxiYWNrRGF0ZSI6IjIwMjUtMDgtMDEiLCJwYWlkVXBUbyI6IjIwMjUtMDgtMDEiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiUFdTIiwiZmFsbGJhY2tEYXRlIjoiMjAyNS0wOC0wMSIsInBhaWRVcFRvIjoiMjAyNS0wOC0wMSIsImV4dGVuZGVkIjp0cnVlfSx7ImNvZGUiOiJHTyIsImZhbGxiYWNrRGF0ZSI6IjIwMjUtMDgtMDEiLCJwYWlkVXBUbyI6IjIwMjUtMDgtMDEiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IlBDV01QIiwiZmFsbGJhY2tEYXRlIjoiMjAyNS0wOC0wMSIsInBhaWRVcFRvIjoiMjAyNS0wOC0wMSIsImV4dGVuZGVkIjp0cnVlfV0sIm1ldGFkYXRhIjoiMDEyMDIyMDkwMlBTQU4wMDAwMDUiLCJoYXNoIjoiVFJJQUw6LTE1NTI3NDEyNzIiLCJncmFjZVBlcmlvZERheXMiOjcsImF1dG9Qcm9sb25nYXRlZCI6ZmFsc2UsImlzQXV0b1Byb2xvbmdhdGVkIjpmYWxzZX0=-cQoXljKE7uBjoI23ZBPd84P89vQAaprVvVhxj1/nSOABUZKPZMCs6p2id5WKBP1n0EoPHykvzd0y7QcdcO2hxNwbaBRZxpPFuuMigGazrrt+zSd9+UlFXmtcseFTXlWn7Jw2qqp7WSVQlj+o3gf2Gic9/Vp2pAmIajMGdFDsXcHbYUrLwTRVtFkNtggtsqh0AVS8xhzLuXMzGXJsqEEWPZCKMEjy0bURm/FQvrRC/gIptJzuybSb/neqKmvxZefX1lhe98igS3tZsL/E+hsQK7ueXVSP2AuuVEz/6qHYknPS7K4UluWpd+ktIxTcHjIykK1tlWlwTsupZTxnvXFWQA==-MIIETDCCAjSgAwIBAgIBDTANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBMB4XDTIwMTAxOTA5MDU1M1oXDTIyMTAyMTA5MDU1M1owHzEdMBsGA1UEAwwUcHJvZDJ5LWZyb20tMjAyMDEwMTkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCUlaUFc1wf+CfY9wzFWEL2euKQ5nswqb57V8QZG7d7RoR6rwYUIXseTOAFq210oMEe++LCjzKDuqwDfsyhgDNTgZBPAaC4vUU2oy+XR+Fq8nBixWIsH668HeOnRK6RRhsr0rJzRB95aZ3EAPzBuQ2qPaNGm17pAX0Rd6MPRgjp75IWwI9eA6aMEdPQEVN7uyOtM5zSsjoj79Lbu1fjShOnQZuJcsV8tqnayeFkNzv2LTOlofU/Tbx502Ro073gGjoeRzNvrynAP03pL486P3KCAyiNPhDs2z8/COMrxRlZW5mfzo0xsK0dQGNH3UoG/9RVwHG4eS8LFpMTR9oetHZBAgMBAAGjgZkwgZYwCQYDVR0TBAIwADAdBgNVHQ4EFgQUJNoRIpb1hUHAk0foMSNM9MCEAV8wSAYDVR0jBEEwP4AUo562SGdCEjZBvW3gubSgUouX8bOhHKQaMBgxFjAUBgNVBAMMDUpldFByb2ZpbGUgQ0GCCQDSbLGDsoN54TATBgNVHSUEDDAKBggrBgEFBQcDATALBgNVHQ8EBAMCBaAwDQYJKoZIhvcNAQELBQADggIBABqRoNGxAQct9dQUFK8xqhiZaYPd30TlmCmSAaGJ0eBpvkVeqA2jGYhAQRqFiAlFC63JKvWvRZO1iRuWCEfUMkdqQ9VQPXziE/BlsOIgrL6RlJfuFcEZ8TK3syIfIGQZNCxYhLLUuet2HE6LJYPQ5c0jH4kDooRpcVZ4rBxNwddpctUO2te9UU5/FjhioZQsPvd92qOTsV+8Cyl2fvNhNKD1Uu9ff5AkVIQn4JU23ozdB/R5oUlebwaTE6WZNBs+TA/qPj+5/we9NH71WRB0hqUoLI2AKKyiPw++FtN4Su1vsdDlrAzDj9ILjpjJKA1ImuVcG329/WTYIKysZ1CWK3zATg9BeCUPAV1pQy8ToXOq+RSYen6winZ2OO93eyHv2Iw5kbn1dqfBw1BuTE29V2FJKicJSu8iEOpfoafwJISXmz1wnnWL3V/0NxTulfWsXugOoLfv0ZIBP1xH9kmf22jjQ2JiHhQZP7ZDsreRrOeIQ/c4yR8IQvMLfC0WKQqrHu5ZzXTH4NO3CwGWSlTY74kE91zXB5mwWAx1jig+UXYc2w4RkVhy0//lOmVya/PEepuuTTI4+UJwC7qbVlh5zfhj8oTNUXgN0AOc+Q0/WFPl1aw5VV/VrO8FCoB15lFVlpKaQ1Yh+DVU8ke+rt9Th0BCHXe0uZOEmH0nOnH/0onD 4.mac的GoLand激活先关上终端先运行uninstall.sh此步骤是一键帮你去掉以前所激活过留下的货色,解决key is invalid的问题。避免激活失败而后终端输出 sh /Users/chen23/Downloads/jihuo-tool/scripts/uninstall.sh 这里间接把uninstall.sh拖动到终端即可。记得mac运行是sh xxxxx去运行.sh文件(记得sh前面加空格加门路) 呈现done阐明胜利。 再执行install.sh,与下面同理,呈现done,the kill xxxxx 阐明胜利。 而后敞开GoLand,从新关上GoLand,输出激活码激活即可 而后就成了,工夫是假的,曾经永恒激活了,而且是官网最新版本哦,如果你从新更新了,再执行下面的操作即可。 软件下载地址:PS: 激活补丁页面提取人数过多,导致分享的百度网盘链接容易被封:激活补丁分享失败蛋疼ing,为限度人数,目前暂不提供页面间接提取,改为从笔者公众号提取。 在微信公众号 【徐公】,回复 goland 即可获取下载地址

March 14, 2023 · 1 min · jiezi

关于goland:golang与php的区别与联系

GO语言运行比PHP更快。Go语言是一种动态类型的编程语言,而PHP是动静类型的编程语言。这使得Go语言程序在运行期间更平安,因为谬误和类型混同能够在编译期间发现和修复,而PHP程序则要在运行时能力发现这些问题。 golang并发比PHP反对比拟好Go语言提供了并发编程的原生反对,这是Go语言绝对于PHP的一个劣势。Go语言的并发模型采纳了协程(或称为goroutine)的概念,它是Go语言提供的轻量级的线程,能够在单个过程中并行执行多个工作。Go语言的并发模型非常简单易用,能够不便地实现多任务并行处理,进步程序的执行效率。 PHP也有相似的并发模型,能够应用多线程或多过程来实现多任务并行处理。然而,PHP的多线程反对并不是很好,并且创立和治理多线程也比较复杂。此外,PHP的过程治理也绝对较为简单,须要应用第三方库或扩大能力实现。 PHP能够用来创立守护过程,然而因为PHP的过程治理性能并不是很欠缺,所以在应用PHP创立守护过程时可能会存在一些问题。 具体来说,PHP可能存在以下问题: 创立过程的代码可能存在语法错误或逻辑谬误,导致守护过程无奈失常运行。 在创立守护过程时,可能会产生内存透露或其余性能问题,导致守护过程解体。 在运行过程中,守护过程可能会遇到意外的环境谬误或系统故障,导致守护过程解体 GO语言比起PHP更加平安。PHP因为是弱类型语言,并未辨别整型、浮点型、字符串型,而是采纳动静变量的模式。所以,在运行期间,可能会呈现不可控的类型转换。而GO语言采纳的是动态类型,不会呈现不可控的类型转换,所有类型转换均是显式转换。 GO语言比PHP更容易部署GO语言自带HTTP服务器,动态编译后,打包了所有须要的依赖。只须要将编译后的执行文件放于零碎中,则能够间接执行。而PHP而须要当时部署PHP环境,相较于GO语言来说,部署上还是麻烦了许多。 GO语言调用C库更容易。在PHP中,若须要调用C库,只有通过PHP扩大或零碎调用来实现,每当批改了PHP扩大后,则须要重新部署PHP环境才能够失效。而GO语言外部集成了cgo,能够无缝嵌入C代码,也能够很容易地链接C库。 其余细节区别golang简略的思维,没有继承,多态,类等等golang有map、channel、slice等数据结构。

February 13, 2023 · 1 min · jiezi

关于goland:Go-官方依赖注入工具wire

wire是Go官网推出的一款相似于Spring依赖注入工具。有别于以往的依赖注入工具facebookgo/inject、uber-go/dig等,采纳反射实现。wire采纳通过代码形容对象之间的依赖关系,而后主动生成代码在编译期实现依赖注入的工具源码:https://github.com/google/wire 什么是依赖注入说到依赖注入(Dependency Injection,缩写DI),不得不提管制反转(Inversion of Control,缩写为IoC)。IoC是一种设计思维,核心作用是升高代码耦合度。传统零碎利用是在类外部被动援用对象,从而导致类与类之间高度耦合,不利于保护,而有了IoC容器后,把创立和查找对象工作交给容器,由容器动静的将某个依赖关系注入对象中,控制权由调用者利用代码转移到IoC容器,控制权产生了反转,从而实现对象间解耦。依赖注入是实现IoC解决依赖问题的设计模式。 举例 type TestA struct { B *TestB//依赖}type TestB struct {}func NewA() *TestA { return &TestA{ B:new(TestB), }}下面代码,TestA依赖TestB,这样当前退出须要对TestB批改时,还须要对TestA做批改。这样做有以下几个问题:代码耦合性高不利于保护这种依赖关系不利于性能复用,TestA无奈复用示例好的TestB不不便单元测试 为此咱们能够对代码以依赖注入形式批改 type TestA struct { B *TestB}type TestB struct {}func NewA(b *TestB) *TestA { return &TestA{ B:b, }}这样,咱们将初始化后的TestB注入到NewA中了,解耦了局部依赖。以上的依赖注入形式,在代码少,零碎不简单时实现起来没问题,当零碎宏大到肯定程序时就力不从心了。怎么解决呢?这里就须要着重介绍的wire依赖注入工具了。 wire 应用办法装置go install github.com/google/wire/cmd/wire@latest并确保将$GOPATH/bin其增加到您的$PATH. 根本Wire 有两个外围概念:providers 和 injectors。providers 示例在foobarbaz目录下创立文件foobarbaz.go,内容如下 package foobarbazimport ( "context" "errors")type Foo struct { X int}// ProvideFoo returns a Foo.func ProvideFoo() Foo { return Foo{X: 42}}type Bar struct { X int}// ProvideBar returns a Bar: a negative Foo.func ProvideBar(foo Foo) Bar { return Bar{X: -foo.X}}type Baz struct { X int}// ProvideBaz returns a value if Bar is not zero.func ProvideBaz(ctx context.Context, bar Bar) (Baz, error) { if bar.X == 0 { return Baz{}, errors.New("cannot provide baz when bar is zero") } return Baz{X: bar.X}, nil}injectors:创立wire.go文件(文件名能够不是wire,但个别是这个)示例 ...

December 16, 2022 · 3 min · jiezi

关于goland:GS-Admin-限流功能的使用

阐明在日常网站的经营过程种,当并发数达到咱们服务的阈值的时候,咱们能够通过限流的形式保障服务可用性。常见的限流办法: 1. 应用带缓冲的chann,当chan塞满当前,拒绝服务或者给一个敌对的提醒或跳转到一个敌对的页面等。 2. 计数器,在10秒内只承受100 申请,当超过100申请后,拒绝服务,当超过10秒后,计数归零,从新承受申请。 3. 应用httpserver的频率限度,无需本人实现。 4. 令牌桶算法:以恒定的速度往令牌桶中放入令牌,当有申请过去则从令牌桶中获取令牌进行后续申请,当获取令牌失败后则进行敌对解决。 5. 漏桶算法:申请先进入到漏桶里,而漏桶以固定的速率解决申请,当申请数量超过漏桶的容量时,将超出的申请进行敌对解决,不适宜突发申请场景。 下面两种令牌的算法区别:漏桶算法,可能强行限度传输速率,令牌桶算法:可能限度均匀传输速率,容许某种突发状况。 GS Admin 限流形式GS Admin 采纳golang外部有一个十分好用的限流器time/rate位于golang.org/x/time/rate 具体的用法能够产靠官网文档。GS Admin曾经封装了web 中间件只须要在配置文件配置想应得参数就能够了 rate: limit: 15 //每秒产生得令牌数量 burst: 2 //令牌得大小通过测试如果超过了限流,中间件就会触发,代码如下 func Limiter() gin.HandlerFunc { return func(c *gin.Context) { if global.Limiter.Allow() == false { global.Response{}.Failed(c, "以后申请过快,请稍后再试!") c.Abort() return } c.Next() }}

November 28, 2022 · 1 min · jiezi

关于goland:Goland-迁移到-Visual-Studio-Code

Visual Studio Code 以下简称 vscode。背景日常工作中用 Goland 比拟多,比拟棘手,然而本人的我的项目是不能用公司资产的。而且工作工夫之外,其实也没有太多的工夫写代码,所以我没有购买 Goland 集体版本的 license。那么偶然须要写代码的时候怎么办呢?无非就是两个抉择,vim 和 vscode。本着尽量贴近大多数场景而且尽可能少的自定义配置的准则,我抉择了 vscode。 过程快捷键 快捷键是我遇见的第一个问题,也是妨碍我应用 vscode 的次要问题。不过好在有IntelliJ IDEA Keybindings,装置之后,不须要任何的自定义配置,即可实现跟 Goland 相似的快捷键体验。这里须要留神的是,Goland 自身也有很多套快捷键体系,如果习惯的是其余的快捷键体系,那么须要找对应的配置。 页面布局启动页Goland 在近期的更新之后,每次关上 IDE,获显示近期的我的项目。vscode 外面实现相似的成果的话,配置如下: Editor 相干字体和字号大小,这部分比较简单,不须要多做形容。页面布局上,我关掉了『流动栏』,这样页面更简洁,也带来了搜寻框不方便使用的问题。   语言包  因为 vscode 的配置太多且太简单了,我装置了简体中文语言包。在官网市场搜寻即可。   主题  Goland 我习惯用红色背景的主题,vscode 有个主动切换的性能,理论体验之后,发现也挺好用的,就保留了这个设置。light 和 dark theme 配置如下: 搜寻框 Goland 外面的搜寻框是以浮动窗口的模式存在的,vscode 中的搜寻是在左侧有个独自的 tab,每次应用起来都很不不便,通过一番搜寻之后,发现 vscode 反对把一些在流动栏的性能间接拖拽到右侧或者底部的 panel 局部,拖到底部 panel 之后,基本上满足了我的需要。尽管不是 floating windows,然而起码没那么好受了。 关键词高亮Goland 外面,FIXME、TODO 等关键词是默认高亮显示的,而且能够自定义关键词,比方我会定义 Notice。vscode 须要借助第三方插件实现这个性能,我应用的是TODO Highlight,比拟繁琐的一点是须要做一些自定义的配置才会有比拟易用的成果,目前我的配置是: { // ... // text 是设定的关键字,加: 的目标是避免出现字符串 NOTESomething 被高亮。 "todohighlight.isCaseSensitive": true, "todohighlight.keywords": [ { "text": "NOTE:", "color": "#ecf0f1", "border": "1px solid #2980b9", "borderRadius": "4px", "backgroundColor": "#3498db", }, { "text": "HACK:", "color": "#ecf0f1", "border": "1px solid #8e44ad", "borderRadius": "4px", "backgroundColor": "#9b59b6", }, { "text": "FIXME:", "color": "#ecf0f1", "border": "1px solid #f39c12", "borderRadius": "4px", "backgroundColor": "#f1c40f", }, { "text": "BUG:", "color": "#ecf0f1", "border": "1px solid #c0392b", "borderRadius": "4px", "backgroundColor": "#e74c3c", }, { "text": "TODO:", "color": "#ecf0f1", "border": "1px solid #27ae60", "borderRadius": "4px", "backgroundColor": "#2ecc71", } ], // ... }编译运行代码这部分我的需要并不多,因为大多数我的项目都会应用 build 和 run 脚本在 Terminal 中运行,所以 vscode 自身间接 run code 的能力我就无所谓了。有些状况下应用Code Runner 据说很不便,不过我没有认真钻研。 ...

September 29, 2022 · 1 min · jiezi

关于goland:goland-debug-崩溃

这两天遇到一个诡异的问题,也是诡异中解决的,尽管问题没了,然而也不晓得是咋好的。前一秒还在debug,加了两行代码,再执行debug的时候,总是执行几步就解体。每次蹦的时候,console提醒还都不一样,回顾下,大略有这么几种:1,unexpected signal during runtime execution2, SIGTRAP: trace trap3, signal SIGSEGV: segmentation violation4,Cgo tool test2json: signal: interrupt5, debugger disconnected unexpectedly6, runtime.debugCallV2() 反正每次都会变着花色的给出错误信息。 每个都google了一圈,除了看不懂的,看的懂的都试了一遍:1,卸载现有1.16版本golang,装置go 1.17版。我用的这个命令装置的,brew install go@1.17 在大佬的演示下,晓得了一种新的装置形式,在goland中,comd+, 组合键,弹出这个框框按➕,选好version,指定好location。就能装置了。 而后就是配置go环境变量,放到 ~/.zshrc 中 #go环境配置export GOROOT="/Users/didi/go/go1.17.13"export GOPATH="/Users/didi/project/dp/go/"export GOBIN="$GOROOT/bin"export PATH="$PATH:$GOBIN"export GOSUMDB=off另外配一下goland 的 gopath,要把本人的代码根目录蕴含进去 而后就是gomodules了,各家公司都不一样 折腾一圈,有效! 2,重装goland ide。有效! 3,go get -v github.com/go-delve/delve/cmd/dlv这个应该是重装dlv的吧。dlv就是一个go的一个调试的组件,我目前先这么了解。 到此我曾经放弃了。 4,参考这篇文章 https://youtrack.jetbrains.co...给出的步骤折腾goland。a, add "#com.goide.dlv.DlvVm" (without quotes) in Help | Debug Log Settings... dialogb, restart the IDE.c, recreate the problemd, collect logs using Help | Collect Logs and Diagnostic Data menu item and attach them here.看 这个idea.log中,有一堆symbol index 无奈找到的谬误,应该变量符号表地址给搞错了(纯属瞎猜),反正怎么解我也不晓得,还有 一些dlv记录的什么信息,咱也看不懂。 ...

August 31, 2022 · 1 min · jiezi

关于goland:Mac端GO语言集成开发工具环境GoLand-2022激活码

GoLand 2022是一个GO语言集成开发工具环境,基于IntelliJ平台,反对JetBrAIns插件体系,领有针对GO语言的代码助手、代码编辑器、代码调试等工具,反对前端和后端开发,并且反对IntelliJ插件,能够大大提高Go语言开发者的开发效率。

August 6, 2022 · 1 min · jiezi

关于goland:用面向对象的方式操作-JSON-甚至还能做四则运算-JSON-库

前言在之前实现的 JSON 解析器中过后只实现了将一个 JSON 字符串转换为一个 JSONObject,并没有将其映射为一个具体的 struct;如果想要获取值就须要先做断言将其转换为 map 或者是切片再来获,会比拟麻烦。 decode, err := gjson.Decode(`{"glossary":{"title":"example glossary","age":1}}`) assert.Nil(t, err) glossary := v["glossary"].(map[string]interface{}) assert.Equal(t, glossary["title"], "example glossary") assert.Equal(t, glossary["age"], 1)但其实转念一想,局部场景咱们甚至咱们只须要拿到 JSON 中的某个字段的值,这样还须要先申明一个 struct 会略显麻烦。 通过查问发现曾经有了一个相似的库来解决该问题,https://github.com/tidwall/gjson 并且 star 数还很多(甚至名字都是一样的),阐明这样的需要大家还是很强烈的。 于是我也打算减少相似的性能,应用形式如下: 最初还加上了一个四则运算的性能。面向对象的形式操作 JSON因为性能相似,所以我参考了 tidwall 的 API 但去掉一些我感觉临时用不上的个性,并调整了一点语法。 以后这个版本只能通过确定的 key 加上 . 点符号拜访数据,如果是数组则用 [index] 的形式拜访下标。[] 符号拜访数组我感觉要更合乎直觉一些。 以下是一个蕴含多重嵌套 JSON 的拜访示例: str := `{"name": "bob","age": 20,"skill": { "lang": [ { "go": { "feature": [ "goroutine", "channel", "simple", true ] } } ]}}`name := gjson.Get(str, "name")assert.Equal(t, name.String(), "bob")age := gjson.Get(str, "age")assert.Equal(t, age.Int(), 20)assert.Equal(t, gjson.Get(str,"skill.lang[0].go.feature[0]").String(), "goroutine")assert.Equal(t, gjson.Get(str,"skill.lang[0].go.feature[1]").String(), "channel")assert.Equal(t, gjson.Get(str,"skill.lang[0].go.feature[2]").String(), "simple")assert.Equal(t, gjson.Get(str,"skill.lang[0].go.feature[3]").Bool(), true)这样的语法应用集体感觉还是满合乎直觉的,置信对使用者来说也比较简单。 ...

July 4, 2022 · 2 min · jiezi

关于goland:goland-快捷工具集效率

一、live templage on tag配置 产出type user struct{ testAge int `cjson:"testAge"` testName int `json:"test_name"`}二、go mod config配置 产出修复list -m卡住的问题 三、代码行被golang强行折叠配置 产出

November 12, 2021 · 1 min · jiezi

关于goland:GO语言入门-六函数和方法

是时候开始钻研函数和办法了。。。函数通过函数,能够把开发工作分解成一个个小的单元,这些小单元能够被其余单元复用,进而进步开发效率、升高代码重合度。 1. 函数申明func funcName(params) result { body}关键字 func函数名字 funcName函数的参数 params,用来定义形参的变量名和类型result 是返回的函数值,用于定义返回值的类型,如果没有能够省略body 就是函数体,能够在这里写函数的代码逻辑写一个计算两数相加的函数: package mainimport ( "fmt")// 计算两值之和// 变量名称在前,变量类型在后// 变量名称叫做参数名称,也就是函数的形参func addTwoNum(a int, b int) int{ return a + b}func main(){ fmt.Println(addTwoNum(12, 21))}运行后果为: 2. 多值返回Go 语言的函数能够返回多个值,也就是多值返回第一个值返回函数的后果,第二个值返回函数出错的信息 package mainimport ( "errors" "fmt")// 计算两值之和,如果为正数就返回谬误func addTwoNum(a int, b int) (int, error) { if a < 0 || b < 0 { return 0, errors.New("a或者b不能为正数") } return a + b, nil}func main() { // 获取后果和错误信息 a, err := addTwoNum(-12, 21) if err != nil { fmt.Println(err) } else { fmt.Println("计算结果为:", a) }}运行后果为: ...

October 18, 2021 · 2 min · jiezi

关于goland:GO语言入门-五集合类型

进阶,进阶,向汇合类型登程。。。汇合类型很多同一个类型的元素放在一起的场景就是汇合。数组(array),切片(slice),映射(map)都是汇合类型,用以寄存同一类元素。 1. Array(数组)数组寄存的是固定长度,雷同类型的数据而且这些寄存的元素是间断的寄存的数据类型没有限度 示例代码如下: package mainimport "fmt"func main() { // 这里中括号外面的5示意的是数组的长度,前面花括号外面的是初始化 array := [5]string{"a","b","c","d","e"} fmt.Println("array的值为::", array)}运行后果为: 1.1 数组在内存中是间断寄存的,并且每个元素都有一个下标:这里咱们就能够通过 array[下标] 来获取某个特定的元素: package mainimport "fmt"func main() { // 这里中括号外面的5示意的是数组的长度,前面花括号外面的是初始化 array := [5]string{"a","b","c","d","e"} fmt.Println("array中第四个值为:", array[3])}运行后果为: 1.2 数组的长度能够省略Go语言会主动依据大括号两头元素的个数主动推导数组的长度。这里只是实用于所有元素都被初始化的时候。 package mainimport "fmt"func main() { // 中括号外面用三个英文句号来省略数组的长度 array := [...]string{"a","b","c","d","e"} fmt.Println("array的值为:", array)}运行后果为: 如果只是初始化特定索引的元素做初始化,就不能省略数组长度了没有初始化的元素其默认值都是数组类型的零值,string就是空字符串 package mainimport "fmt"func main() { // 省略数组长度,只是初始化特定索引的话,数组长度就是最大的索引的长度 array := [...]string{1:"a",3:"c"} fmt.Println("array的长度为:", len(array))}运行后果为: 1.3 数组循环大部分状况下应用的是for range这种Go语言的新型循环 package mainimport "fmt"func main() { array := [...]string{"a","b","c","d","e"} for i,v := range array{ fmt.Println("key为:", i, ", value为:",v) } // 如果返回的值不须要,就能够用 _ 抛弃 for _,v := range array{ fmt.Println("value为:", v) }}运行后果为: ...

September 16, 2021 · 2 min · jiezi

关于goland:GO语言入门-四控制结构

进阶,进阶,向管制接口登程。。。流程管制语句流程管制语句用于控制程序的执行程序,这样程序就具备了逻辑构造。 1. if 条件语句依据布尔值的表达式来决定抉择哪个分支执行:如果表达式的值为true,则if分支被执行;如果表达式的值为false,则else分支被执行;示例: package mainimport "fmt"func main (){ // 将10赋值给i i := 10 // 须要留神的是: // if前面的条件表达式不须要应用() // 每个条件分支(if或者else)中的大括号是必须的 // if紧跟的大括号{不能独占一行,else前的大括号}也不能独占一行 // 如果你的条件分支不止两个,那么你还能够在if·····else条件语句中减少多个else if if i > 10 { fmt.Println("i大于10") } else if i == 10{ fmt.Println("i等于10") } else { fmt.Println("i小于10") }}输入后果为: 划重点:和其余的编程语言不同的是,Go语言中的if语句中能够有一个简略的表达式语句,并将该语句与条件语句用分号离开。 革新示例如下: package mainimport "fmt"func main() { // 间接将i的赋值放到if前面,并与条件语句用分号隔开 // 这里须要留神的是,在if前面申明的变量只能在if·····else条件语句范畴内应用 if i := 10; i > 10 { fmt.Println("i大于10") } else if i == 10 { fmt.Println("i等于10") } else { fmt.Println("i小于10") }}输入后果为: ...

September 16, 2021 · 2 min · jiezi

关于goland:GoLand-如何debug-Goroutine

/*如何应用 goland debug goroutine*/package mainimport ( "fmt" "runtime" "sync")type Tester interface { test1() test2() test3()}type T struct { a int s *sync.WaitGroup}func main() { fmt.Println("main start!") s := &sync.WaitGroup{} s.Add(3) t := T{a: 1, s: s} // 断点 // bebug 到这里时,须要在帧栏目中抉择 main.test1 的协程帧,不然不会 debug到 test1 函数外部的.或者光标放入 test1 函数外部,点击运行到光标处也行 go t.test1() // 断点 go t.test2() go t.test3() // 断点 s.Wait() fmt.Println("main end!")}// 如何进入 goroutinefunc (t *T) test1() { defer func() { t.s.Done() }() t.a++ // 断点 fmt.Println("test1", t.a)}//异样断点func (t *T) test2() { defer func() { // 产生宕机时,获取panic传递的上下文并打印 err := recover() switch err.(type) { case runtime.Error: // 运行时谬误 fmt.Println("runtime error:", err) default: // 非运行时谬误 fmt.Println("error:", err) } t.s.Done() }() t.a++ panic("制作一个谬误") fmt.Println("test2", t.a)}// 如何跳过循环func (t *T) test3() { fmt.Println("test start!") // 断点 for i := 0; i < 30; i++ { // debug 到一些循环时,不想跟踪每个循环运行,能够点击 步出(F8)跳到下一个 debug 点 fmt.Println("test3", i) } fmt.Println("test end!") // 断点 t.s.Done()}/*调试心得:1.要是协程帧打不开,那可能是帧太多了,能够在 goland 的设置中设置协程数限度2.有时候下面的形式切换不到想看的协程,能够在协程运行左近(go XXX()处),试试应用运行到光标处(光标放到协程函数中)3.有时候单步运行到了循环中,同样能够应用运行到光标处(光标点击到循环外)或者点击回复程序按钮(最好在循环外打一个端点,点击恢复程序按钮会运行到此处)3.https://www.jetbrains.com/help/go/debugging-code.html 官网教程,但感觉没说很细*/

May 26, 2021 · 1 min · jiezi