Files
gobridge/example/main.go
2026-04-10 09:24:28 +08:00

142 lines
4.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package main
import (
"context"
"fmt"
"log"
"path/filepath"
"runtime"
"git.fsdpf.net/go/gobridge"
)
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Score float64 `json:"score"`
Level string `json:"level,omitempty"`
}
func main() {
_, file, _, _ := runtime.Caller(0)
script := filepath.Join(filepath.Dir(file), "worker.py")
pool, err := gobridge.NewPool(script,
gobridge.WithWorkers(2),
gobridge.WithMaxConns(4),
)
if err != nil {
log.Fatal(err)
}
defer pool.Close()
ctx := context.Background()
// ── 普通调用 ──────────────────────────────────────────────────────────
sum, err := gobridge.Invoke[int](ctx, pool, "add", 3, 4)
if err != nil {
log.Fatal(err)
}
fmt.Println("add(3, 4) =", sum) // 7
// ── 流式输出Python yield → Go channel ──────────────────────────────
ch, err := gobridge.Invoke[chan int](ctx, pool, "range_gen", 1, 6)
if err != nil {
log.Fatal(err)
}
fmt.Print("range_gen(1, 6) =")
for v := range ch {
fmt.Print(" ", v)
}
fmt.Println() // 1 2 3 4 5
// ── 流式输入Go channel → Python Iterator ───────────────────────────
inputCh := make(chan int, 10)
go func() {
for i := 1; i <= 5; i++ {
inputCh <- i
}
close(inputCh)
}()
total, err := gobridge.Invoke[int](ctx, pool, "sum_stream", inputCh)
if err != nil {
log.Fatal(err)
}
fmt.Println("sum_stream(1..5) =", total) // 15
// ── 双向流Go channel 输入 + Go channel 输出 ────────────────────────
inputCh2 := make(chan int, 10)
go func() {
for i := 1; i <= 5; i++ {
inputCh2 <- i
}
close(inputCh2)
}()
outCh, err := gobridge.Invoke[chan int](ctx, pool, "double_stream", inputCh2)
if err != nil {
log.Fatal(err)
}
fmt.Print("double_stream(1..5) =")
for v := range outCh {
fmt.Print(" ", v)
}
fmt.Println() // 1 4 9 16 25
// ── struct 普通调用 ───────────────────────────────────────────────────
user, err := gobridge.Invoke[User](ctx, pool, "get_user", 42)
if err != nil {
log.Fatal(err)
}
fmt.Printf("get_user(42) = %+v\n", user)
// ── slice 输入,返回标量 ───────────────────────────────────────────────
users := []User{
{ID: 1, Name: "alice", Score: 5.0},
{ID: 2, Name: "bob", Score: 8.0},
{ID: 3, Name: "carol", Score: 12.0},
}
scoreSum, err := gobridge.Invoke[float64](ctx, pool, "total_score", users)
if err != nil {
log.Fatal(err)
}
fmt.Printf("total_score([alice,bob,carol]) = %.1f\n", scoreSum)
// ── slice 输入输出 ─────────────────────────────────────────────────────
enriched, err := gobridge.Invoke[[]User](ctx, pool, "enrich_users", users)
if err != nil {
log.Fatal(err)
}
fmt.Println("enrich_users:")
for _, u := range enriched {
fmt.Printf(" %+v\n", u)
}
// ── 流式输出 structPython yield User → Go chan User ─────────────────
userCh, err := gobridge.Invoke[chan User](ctx, pool, "gen_users", 3)
if err != nil {
log.Fatal(err)
}
fmt.Print("gen_users(3) =")
for u := range userCh {
fmt.Printf(" {%d %s %.0f}", u.ID, u.Name, u.Score)
}
fmt.Println()
// ── 双向流 structGo chan User 输入 → Python 处理 → Go chan User 输出 ─
inCh := make(chan User, 5)
go func() {
for _, u := range users {
inCh <- u
}
close(inCh)
}()
procCh, err := gobridge.Invoke[chan User](ctx, pool, "process_users", inCh)
if err != nil {
log.Fatal(err)
}
fmt.Println("process_users:")
for u := range procCh {
fmt.Printf(" %+v\n", u)
}
}