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()

使用建议

  1. 快速入门请参考教程
  2. 在笔记本中运行%help可以查看所有可用命令
  3. 使用%%前缀可以自动插入func main {...}
  4. 对于交互式开发,可以考虑使用must包简化错误处理

GoNB特别适合数据科学、测试、报告编写、实时演示等场景。


更多关于golang实现Jupyter Notebook交互式编程的插件GoNB的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang实现Jupyter Notebook交互式编程的插件GoNB的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


GoNB - Golang Jupyter Notebook 插件使用指南

GoNB 是一个让 Golang 支持 Jupyter Notebook 交互式编程的插件,它允许你在 Jupyter 环境中直接运行 Go 代码,非常适合数据科学、教学和快速原型开发。

安装 GoNB

先决条件

  1. 已安装 Go (建议 1.18+)
  2. 已安装 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)
}

常见问题解决

  1. 导入本地包: 在 Notebook 同目录下创建 go.mod 文件,然后可以导入本地包

  2. 性能优化:

    • 使用 //go:inline 指令优化热点代码
    • 避免在循环中频繁分配内存
  3. 调试技巧:

    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 语言开辟了新的应用场景。

回到顶部