Go
Go 语言程序设计
许野平
非常喜欢软件设计这份工作,有不错的数学基础,喜欢读书、摄影与音乐。
展开
-
协程、纤程会利用多核CPU的并行计算优势吗?
Go语言的goroutines提供了并发执行的机制,而Go运行时则负责在多核CPU上实现真正的并行执行。而协程和纤程只能在单个线程内运行,即使它们可以在单个线程内高效地处理多个任务,但这些任务仍然是顺序执行的,而不是并行执行的。它会根据系统的核心数量和当前的负载情况,将goroutines分配到不同的核心上执行,从而实现真正的并行计算。因此,当你使用go命令修饰的函数时,这些函数会在goroutines中并发执行,并且Go运行时会自动利用多核CPU实现并行计算,以提高程序的执行效率。原创 2024-03-16 13:40:20 · 584 阅读 · 0 评论 -
Go语言与Rust哪一个更有发展前景?
此外,Go语言的社区非常活跃,有很多优秀的开源项目和开发者资源,这也为Go语言的发展提供了强大的支持。如果你对内存安全和并发性能有更高的要求,或者想要挑战自己学习一门更具挑战性的语言,那么Rust可能更适合你。Go语言在云计算、大数据和分布式系统等领域有着广泛的应用,而Rust则在系统级编程和性能要求极高的领域具有优势。Go语言和Rust都是目前非常受欢迎的编程语言,它们各自具有独特的优势和适用场景。总的来说,Go语言和Rust都是非常有前景的编程语言,它们各自具有独特的优势和适用场景。原创 2024-03-13 15:31:13 · 1575 阅读 · 0 评论 -
Rust 的 channel 为什么不设计成与 Go 语言一样的风格?
Rust的通道机制用于线程之间的通信,但由于Rust的所有权规则,无法同时持有多个可变引用,因此通道被分成了接收(rx)和发送(tx)两部分。然而,这种设计仍然提供了一种有效的方式来规范并发操作中的通信和数据交换。在Rust中,一个实现消息传递并发的主要工具就是通道(channel)。这种设计借鉴了Go语言的通道,尽管具体实现和使用方式可能有所不同。总的来说,虽然Rust和Go在通道机制的具体实现和使用上可能有所不同,但它们都提供了一种类似的方式来处理并发编程中的通信问题。原创 2024-03-13 15:27:43 · 369 阅读 · 0 评论 -
Golang 编译生成 DLL 文件
去年的时候还在发愁如何用 Go 语言编译 DLL 文件, 今年就已经完全实现了,谷歌这样做是非常明智的。编译过程中需要 gcc 的支持,Windows 环境下的 gcc 系统是 MinGW,去官网下载即可。地址是:https://sourceforge.net/projects/mingw-w64/编写 Go 语言程序:exportgo.gopackage mainimport "C"...原创 2019-10-27 23:00:20 · 6710 阅读 · 4 评论 -
Golang: url.Parse、RawQuery 用法
直接上例子吧:func time_GET(w http.ResponseWriter, r *http.Request) { u, _ := url.Parse(r.URL.String()) values, _ := url.ParseQuery(u.RawQuery) fmt.Println(u) // /time?a=111&b=121...原创 2018-07-31 22:35:48 · 12073 阅读 · 5 评论 -
引用还是复制?看看 Golang 中诡异的切片操作
切片赋值,实际上只是复制了地址:b := ab 引用了 a 的地址。因此,b 的任何修改,都会影响 a。但是,如果 b 扩容了,b 就会从新申请空间,把数据复制到新空间。b 与 a 就没啥关系了。感觉 Golang 的这个设计真是很烂!package mainimport ( "fmt")func main() { a := []int{0, 1, 2, 3, 4} b原创 2019-01-12 17:06:36 · 2557 阅读 · 0 评论 -
忽然感悟到 Golang 语言中的通道 chan 的重要意义
我发现 Haskell、Erlang 这类函数式程序设计语言,都是采用了通道来锁定资源,利用通讯共享数据,最根本的原因,就是确保代码的“可验证性”。原创 2019-01-20 21:15:24 · 926 阅读 · 0 评论 -
切片,概念是Go语言中的亮点,实现方式是Go语言最大的败笔
今天忍不住又吐槽Go语言的切片,有些忍无可忍了。切片这个概念是非常好的,回避了用指针操作内存,但又能从抽象层次灵活操纵内存。让我无法忍受的是他的实现,下面这段代码的结果是完全不确定的,它取决于切片初始化时预留的空间大小。 n = ??? ... a := make([]int, 3, n) b := append(a, 123) a[0] = 999 fmt.Println(b)...原创 2019-04-06 16:51:02 · 412 阅读 · 0 评论 -
使用delve调试Golang程序
使用delve调试Golang程序技巧Google官方为Golang的调试例子默认使用了gdb,然而, 使用gdb调试go程序会遇到goroutine的各类问题, 因为gdb不懂go,因此,这里使用delve黑科技来进行Golang的程序调试。纯命令行调试方法在网上很容易搜索到,本文主要以LiteIDE来进行程序调试。关闭编译器优化正常go build/install出的go程序是完全优化过...转载 2019-07-16 22:37:06 · 1176 阅读 · 0 评论 -
LiteIDE 中GDB模式下调试 Golang 程序单步执行不显示当前行的解决办法
单步执行程序时,跟踪到 Go 语言自带的库文件时能显示当前行,但是运行到我自己写的代码时,就无法显示当前行。研究了半天,发现原因很简单,工作路径名,也就是 gopath 路径中,不能有汉字,把工作目录名称全部改成英文,问题立即解决。...原创 2019-07-17 10:44:26 · 691 阅读 · 0 评论 -
golang 编译错误:evaluated but not used
执行下述代码: ... N := 234 N << 1 ...显示下述错误信息:N << 1 evaluated but not used原因是,N << 1 这个运算返回一个结果,但是没有赋给一个适当的变量。代码的正确写法是: N = N << 1 or M := N << 1当然,也可以写成下面的形式,但是没...原创 2019-08-04 10:12:32 · 11060 阅读 · 1 评论 -
Golang:use of vendored package not allowed 问题原因
很简单,vendor文件夹里面的包路径出现计算机多个目录下,例如c:\go\src;d:\myapp\src等文件夹下存在相同的路径,编译器无法决定加载哪个路径下的文件,于是报错。...原创 2018-07-30 21:36:44 · 14998 阅读 · 4 评论 -
go语言 liteIDE 错误: 进程无法启动.
重新设定 gopath 后,liteIDE 编译运行程序出现 “进程无法启动” 错误提示。解决办法也很简单,在工具栏上把当前环境切换一下,例如我原来是 win32 环境,改成 win32-user即可。我试验了一下,再改回 win32、win64 等,也一切正常。估计用这个操作,可以吧相关路径设置重新更新。...原创 2018-06-23 17:41:48 · 10654 阅读 · 1 评论 -
Go 语言 testing 测试:对自动测试框架的感悟
以前对自动化测试框架无感,也没兴趣使用。学习 Go 语言时,发现自带 testing 测试框架,非常好奇,于是拿过来试试,也顺便体验体验所谓的测试框架是何物。正所谓,不用不知道,一用真奇妙。实际上平时我们自己写程序,为了测试某些功能是否好用,有时候在应用系统不方便用来测试的时候,也会写一写单独的测试程序,其实 Go 语言的 testing 就是在帮你做这件事情的。测试程序不需要编写完整...原创 2018-05-29 14:15:56 · 2719 阅读 · 0 评论 -
从 github 下载 go 语言资源
www.github.com 是一个开源代码托管网站,从中可以下载所需资源。 我在 win7 下使用 go 语言,当然要先安装 go 语言开发环境,然后去 github 下载安装 git 程序,我下载的是 Git-2.16.2-64-bit.exe ,安装完毕后,进入 win7 命令行程序,键入以下命令go get github.com/Go-SQL-Driver/MySQL即可...原创 2018-04-01 10:54:08 · 3822 阅读 · 0 评论 -
用 Go 语言编写 RESTful API
github.com/drone/routes 资源给出了一个简单的 REST 框架,因为 Go 语言提供了非常方便的内置 HTTP 框架,所以自己写一个这样的框架应该不困难,这里是我做的读书和试验笔记,留着做个参考。下面是我摘录的部分代码:package mainimport ( "fmt" "net/http" "github.com/drone/rout...原创 2018-04-01 11:18:56 · 3860 阅读 · 0 评论 -
Go (Golang) 语言读取 http.Request 中 body 的内容
不罗嗦了,直接贴代码,不晓得为什么搞这么复杂,是不是因为担心 body 内容一次接受不全,所以搞了个接口来读取其中的内容?import ( ... "io/ioutil" ...)...func myPost(w http.ResponseWriter, r *http.Request) { s, _ := ioutil.ReadAll(r.Bod...原创 2018-04-24 17:52:06 · 82598 阅读 · 5 评论 -
如何在Go语言中调用DLL?
go语言通过syscall实现对操作系统的调用,从网上找了几个例子,汇集如下:例子一关键代码共四行: h := syscall.LoadLibrary("kernel32.dll") proc := syscall.GetProcAddress(h, "GetVersion") r := syscall.Syscall(uintptr(proc), 0, 0, 0, 0) s...原创 2018-05-17 14:33:01 · 16320 阅读 · 5 评论 -
快速弄明白 Go 语言 GOPATH 设置
Go语言提供两个关键路径,GOROOT 指向系统安装路径,GOPATH指向工作路径。例如:GOROOT = C:\GoGOPATH = D:\MyWorks其中,go语言源代码和编译的中间文件、目标文件存放位置如下:**C:\Go &amp;amp;amp;amp;amp;amp;lt;&amp;amp;amp;amp;amp;amp;lt;--- GOROOT 指向的位置** --src &原创 2018-05-18 10:02:41 · 26763 阅读 · 3 评论 -
Go语言测试框架(testing)用法
Go语言自带测试框架,使用很简单。假设源代码文件为 crypt.gopackage cryptfunc Encrypt(data string, ekey string) string { return ""}func Decrypt(data string, dkey string) string { return ""}测试文件为:my_test.g...原创 2018-05-18 11:48:08 · 14231 阅读 · 0 评论 -
Go 语言函数返回错误 error 的方法
参见示例:import ( ... "errors" ...)...func TestError() error { ... return errors.New("My Error Message!")}原创 2018-06-02 17:27:48 · 10309 阅读 · 0 评论 -
Go 语言的切片与内存复制 memcpy 的实现方法
Go 语言原则上不支持内存的直接操作访问,但是提供了切片功能。最初我以为切片就是动态数组,实际程序设计过程中发现,切片是提供数组一个内存片段的一个合法的手段,利用切片功能,实际上我们可以自由访问数组的任何一个片段,因而可以借助 copy 函数,实现内存复制。不同类型之间的数据复制,可以借助 unsafe 取出变量地址,类型转换为数组后,利用数组切片,实现内存复制。不罗嗦了,试验代码如下:...原创 2018-05-27 20:08:39 · 10551 阅读 · 0 评论 -
Go语言包名冲突问题:math/rand 和 crypto/rand 导入与引用
Go 语言自带源代码库有两个 rand 包,如果同时使用会造成冲突,导入时可利用包的别名机制解决此问题。参见下面示例代码:import ( ... math_rand "math/rand" crypt_rand "crypto/rand" ...)func main() { ... math_rand.Seed(time.Now().Un...原创 2018-05-28 11:24:58 · 4123 阅读 · 0 评论 -
Go 语言获取文件大小
看到用 seek 函数把指针移到文件尾部求文件大小的办法,感觉有些复杂,试验了一下,可以用下面的方法搞定:package mainimport ( &quot;fmt&quot; &quot;os&quot; &quot;path/filepath&quot;)func getFileSize(filename string) int64 { var result =原创 2018-05-28 18:20:57 · 9818 阅读 · 2 评论 -
LiteIDE 代码补全(不能自动提示代码内容)的解决方法
发生这个问题的原因是 C:\liteide\bin 文件夹下有一个 gocode.exe 程序出问题了,到网上搜索一个最新版本覆盖这个文件即可。我做了一个链接,需要的可以下载:修正版 gocode.exe 下载...原创 2018-04-01 10:40:25 · 6302 阅读 · 0 评论