golang实现Jupyter Notebook交互式编程的插件GoNB的使用
GoNB - Jupyter Notebook的现代Go内核
GoNB是一个为Jupyter Notebook设计的现代Go语言内核,它利用Go的快速编译特性实现交互式编程体验。
✨ 主要特性
- 编码时的自动补全和上下文帮助
- 丰富的显示内容:HTML、Markdown(支持LaTeX)、图像、JavaScript、SVG、视频等
- 使用标准Go编译器:100%兼容所有Go项目,包括使用CGO的项目
- 比解释型Go实现更快的执行速度
- 支持go.mod和go.work,允许本地开发
- 支持通过
%wasm
编译和执行Go代码为WASM(实验性功能)
安装方法
🐳 Docker方式(推荐)
docker pull janpfeifer/gonb_jupyterlab:latest
docker run -it --rm -p 8888:8888 -v "${PWD}":/notebooks janpfeifer/gonb_jupyterlab:latest
然后复制粘贴终端输出的URL到浏览器中打开。
Linux和macOS标准安装
go install github.com/janpfeifer/gonb@latest && \
go install golang.org/x/tools/cmd/goimports@latest && \
go install golang.org/x/tools/gopls@latest
安装完成后运行:
gonb --install
示例代码
以下是一个简单的GoNB使用示例,展示如何创建交互式图表:
// 导入必要的包
import (
"gonum.org/v1/plot"
"gonum.org/v1/plot/plotter"
"gonum.org/v1/plot/vg"
)
// 创建正弦函数数据
points := make(plotter.XYs, 100)
for i := range points {
x := float64(i) * 0.1
points[i].X = x
points[i].Y = math.Sin(x)
}
// 创建图表
p := plot.New()
p.Title.Text = "Sine Wave"
p.X.Label.Text = "X"
p.Y.Label.Text = "Y"
line, err := plotter.NewLine(points)
if err != nil {
panic(err)
}
p.Add(line)
// 显示图表
err = p.Save(10*vg.Centimeter, 10*vg.Centimeter, "sine.png")
if err != nil {
panic(err)
}
// 在笔记本中显示图像
DisplayFile("sine.png", "image/png")
交互式Widget示例
// 导入widget相关包
import "github.com/janpfeifer/gonb/gonbui"
// 创建滑块控件
freq := gonbui.NewSlider("Frequency", 0.1, 5.0, 0.1, 1.0)
// 创建绘图函数
plotSine := func() {
points := make(plotter.XYs, 100)
for i := range points {
x := float64(i) * 0.1
points[i].X = x
points[i].Y = math.Sin(x * freq.Value())
}
p := plot.New()
p.Title.Text = "Sine Wave"
line, _ := plotter.NewLine(points)
p.Add(line)
gonbui.DisplayPlot(p)
}
// 将滑块与绘图函数绑定
freq.OnChange(plotSine)
// 初始绘图
plotSine()
使用建议
GoNB特别适合数据科学、测试、报告编写、实时演示等场景。
更多关于golang实现Jupyter Notebook交互式编程的插件GoNB的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang实现Jupyter Notebook交互式编程的插件GoNB的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
GoNB - Golang Jupyter Notebook 插件使用指南
GoNB 是一个让 Golang 支持 Jupyter Notebook 交互式编程的插件,它允许你在 Jupyter 环境中直接运行 Go 代码,非常适合数据科学、教学和快速原型开发。
安装 GoNB
先决条件
- 已安装 Go (建议 1.18+)
- 已安装 Python 3.x 和 Jupyter Notebook/Lab
安装步骤
# 安装 GoNB 内核
go install github.com/janpfeifer/gonb@latest
# 安装 Jupyter 内核
gonb --install
# 可选: 安装常用数据分析包
go get gonum.org/v1/gonum/...
go get gonum.org/v1/plot/...
基本使用
安装完成后,在 Jupyter Notebook 界面中选择 “Go” 内核即可开始编写 Go 代码。
示例 1: 基础语法
package main
import "fmt"
func main() {
fmt.Println("Hello, Jupyter!")
// 自动显示最后一个表达式的结果
1 + 2
}
示例 2: 数据可视化
package main
import (
"gonum.org/v1/plot"
"gonum.org/v1/plot/plotter"
"gonum.org/v1/plot/vg"
)
func main() {
// 创建绘图
p := plot.New()
p.Title.Text = "GoNB Plot Example"
p.X.Label.Text = "X"
p.Y.Label.Text = "Y"
// 创建数据点
points := plotter.XYs{
{0, 0}, {1, 2}, {2, 1}, {3, 3},
}
// 添加线图
line, err := plotter.NewLine(points)
if err != nil {
panic(err)
}
p.Add(line)
// 保存为图片并显示
p.Save(4*vg.Inch, 4*vg.Inch, "plot.png")
// 在 Notebook 中显示图片
DisplayImageFile("plot.png")
}
高级特性
1. 多单元格共享变量
GoNB 支持在多个单元格之间共享变量:
// 第一个单元格
package main
var sharedValue = 42
// 第二个单元格
package main
import "fmt"
func main() {
fmt.Println("Shared value:", sharedValue)
}
2. 使用 Go 模块
package main
import (
"fmt"
"gonum.org/v1/gonum/mat"
)
func main() {
// 创建一个 2x2 矩阵
m := mat.NewDense(2, 2, []float64{
1, 2,
3, 4,
})
// 打印矩阵
fmt.Printf("Matrix:\n%v\n", mat.Formatted(m))
}
3. 交互式小工具
GoNB 支持类似 IPython 的小工具:
package main
import (
. "github.com/janpfeifer/gonb/gonbui"
)
func main() {
// 创建滑块
slider := SliderF64("Select value", 0, 10, 0.1, 5)
// 显示滑块值
Display(slider)
// 使用滑块值
Printf("Current value: %f\n", slider.Value)
}
常见问题解决
-
导入本地包: 在 Notebook 同目录下创建
go.mod
文件,然后可以导入本地包 -
性能优化:
- 使用
//go:inline
指令优化热点代码 - 避免在循环中频繁分配内存
- 使用
-
调试技巧:
package main import ( "fmt" "runtime" ) func main() { // 打印堆栈信息 buf := make([]byte, 1024) runtime.Stack(buf, false) fmt.Printf("%s\n", buf) }
与 Python 交互
GoNB 支持调用 Python 代码:
package main
import (
. "github.com/janpfeifer/gonb/gonbui"
"gonum.org/v1/gonum/mat"
)
func main() {
// 创建 Go 矩阵
m := mat.NewDense(2, 2, []float64{1, 2, 3, 4})
// 转换为 Python numpy 数组
pyCode := `
import numpy as np
go_matrix = np.array(%s)
print("Python received:", go_matrix)
`
ExecPython(pyCode, m)
}
总结
GoNB 为 Golang 开发者提供了强大的交互式编程环境,特别适合:
- 数据分析和可视化
- 算法开发和测试
- 教学演示
- 快速原型开发
通过结合 Go 的性能优势和 Jupyter 的交互特性,GoNB 为 Go 语言开辟了新的应用场景。