Golang优质教程和书籍推荐及常见问题解答
Golang优质教程和书籍推荐及常见问题解答 你好, 我过去曾使用 bash/perl 进行过一些脚本编写。也接触过一点点 Python。 我对 Go 感兴趣的原因是,据我目前了解,我可以用 Go 编写脚本/代码,生成一个二进制文件,然后只需将这个二进制文件上传到服务器即可,无需在服务器上安装编译器/解释器。我的理解正确吗?
如果我安装了外部模块(即那些不属于核心部分的模块),这一点是否仍然成立?例如,我的大部分工作是通过 SSH 登录服务器/设备并捕获输出,或者进行 scp/sftp 文件传输等。
我还需要将数据写入 Excel 表格、创建图表等,并通过电子邮件发送。我可以用 Go 实现这些功能吗?
如果以上都能实现,是否有好的教程或书籍可以让我尝试“浅尝”一下 Go?请告诉我。
更多关于Golang优质教程和书籍推荐及常见问题解答的实战教程也可以访问 https://www.itying.com/category-94-b0.html
你可以查阅一本关于Go语言的优秀书籍——https://go101.org/article/101.html
更多关于Golang优质教程和书籍推荐及常见问题解答的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
欢迎 notadev。
你所有问题的答案都是肯定的。
我在阅读《Go Workshop》时,对 Go 有了“顿悟时刻”。
干杯
是的,你的理解完全正确。Go 编译后生成的是静态链接的二进制文件,可以直接部署到服务器上运行,无需安装额外的运行时或解释器。即使使用了外部模块,Go 默认也会将所有依赖静态编译到二进制文件中(除非依赖了 C 语言库)。下面是一个简单的示例,演示如何编译一个使用外部模块的程序:
package main
import (
"fmt"
"github.com/pkg/sftp"
)
func main() {
fmt.Println("SFTP client example")
// 实际使用 sftp 包的代码...
}
编译命令:
go build -o myapp main.go
生成的 myapp 二进制文件可以直接复制到任何相同操作系统的服务器上运行。
对于你提到的需求,Go 有成熟的库支持:
- SSH/SCP/SFTP:使用
golang.org/x/crypto/ssh标准库或第三方库如github.com/pkg/sftp - Excel 操作:推荐使用
github.com/xuri/excelize/v2 - 图表生成:可以使用
github.com/wcharczuk/go-chart - 邮件发送:标准库
net/smtp或第三方库github.com/go-gomail/gomail
示例:使用 excelize 创建 Excel 文件
package main
import (
"fmt"
"github.com/xuri/excelize/v2"
)
func main() {
f := excelize.NewFile()
f.SetCellValue("Sheet1", "A1", "Hello")
f.SetCellValue("Sheet1", "B1", "World")
if err := f.SaveAs("test.xlsx"); err != nil {
fmt.Println(err)
}
}
推荐学习资源:
官方资源:
- Go 官方教程(交互式入门)
- Effective Go(最佳实践)
- Go by Example(代码示例集合)
书籍:
- 《The Go Programming Language》(Donovan & Kernighan 著)
- 《Go in Action》(William Kennedy 著)
中文资源:
实践建议: 从官方教程开始,然后尝试用 Go 重写你现有的 Perl/Python 脚本。例如,一个简单的 SSH 连接示例:
package main
import (
"fmt"
"golang.org/x/crypto/ssh"
)
func main() {
config := &ssh.ClientConfig{
User: "username",
Auth: []ssh.AuthMethod{
ssh.Password("password"),
},
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
}
client, err := ssh.Dial("tcp", "host:22", config)
if err != nil {
panic(err)
}
defer client.Close()
session, err := client.NewSession()
if err != nil {
panic(err)
}
defer session.Close()
output, err := session.Output("ls -la")
fmt.Println(string(output))
}
Go 的编译特性和丰富的库生态完全能满足你的自动化运维需求。

