iT邦幫忙

2024 iThome 鐵人賽

DAY 29
0

Streamlit 的 with st.echo() 這個語法糖相當方便,它能直接將指定區塊的程式碼擷取出來,並以代碼塊的形式呈現。這非常實用,使用者可以即時查看執行中的程式碼。

with st.echo():
    st.write('This code will be printed')

假如要讓 Golang 做到這件事,需要:

  • 程式碼嵌入: Golang 需要事先將要執行的程式碼嵌入到二進位文件中。這通常是透過 //go:embed 指令來完成。

  • 呼叫點查找: 程式在執行時,需要透過 runtime.Caller(1) 找到呼叫 tgcomp.Echo 的位置,也就是說,要找出那個包含要被提取的程式碼塊的區塊。

  • 程式碼解析: 找到呼叫點後,需要將該區塊的程式碼解析出來。這部分通常會用到 Golang 內建的 parser 套件,將程式碼解析成抽象語法樹 (AST)。

  • 縮排處理: 解析出來的程式碼可能包含縮排,因此需要進行縮排處理,以確保程式碼的格式正確。

_, filename, line, ok := runtime.Caller(1)
left := line - 1
right := line
for i := line; i < len(codeLines); i++ {
	_, err := parser.ParseExpr(strings.Join(codeLines[left:i], "\n"))
	if err == nil {
		right = i
		break
	}
}

curCode = strings.Join(removeIndent(codeLines[left+1:right-1]), "\n")

最後使用者就可以這樣使用

//go:embed main.go
var code string

c := tgframe.NewContainer()
tcmisc.Echo(c, code, func() {
  tccontent.Text(c, "hello echo")
})

https://ithelp.ithome.com.tw/upload/images/20240921/20151240GN5h2jWPQc.png


上一篇
Day28 JSON Component
下一篇
Day30 ToolGUI 功能整理與未來展望
系列文
用 Golang 實作 streamlit 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言