golang 解析word文檔操作
baliance/gooxml
gooxml是可以對整個office document提供支持的golang庫,功能很強(qiáng)大,這里簡單給出對word文檔的讀取案例
安裝
go get baliance.com/gooxml/
go build -i baliance.com/gooxml/…
解析word代碼
package main import ( "fmt" "log" "baliance.com/gooxml/document" ) func main() { doc, err := document.Open("ml.docx") if err != nil { log.Fatalf("error opening document: %s", err) } //doc.Paragraphs()得到包含文檔所有的段落的切片 for i, para := range doc.Paragraphs() { //run為每個段落相同格式的文字組成的片段 fmt.Println("-----------第", i, "段-------------") for j, run := range para.Runs() { fmt.Print("\t-----------第", j, "格式片段-------------") fmt.Print(run.Text()) } fmt.Println() } }
舉個例子:
下圖為word文檔的截圖,總共四行,第一行有三種字體
運(yùn)行代碼結(jié)果如下:
補(bǔ)充:golang go doc 與 godoc 文檔生成查看
Go語言項目十分重視代碼的文檔,在軟件設(shè)計中,文檔對于軟件的可維護(hù)和易使用具有重大的影響。因此,文檔必須是書寫良好并準(zhǔn)確的,與此同時它還需要易于書寫和維護(hù)。
Go語言注釋
Go語言中注釋一般分為兩種,分別是單行注釋和多行注釋
單行注釋是以 // 開頭的注釋,可以出現(xiàn)在任何地方。
多行注釋也叫塊注釋,以 /* 開頭,以 */ 結(jié)尾,不可以嵌套使用,一般用于包的文檔描述或注釋成塊的代碼片段。
每一個 package 都應(yīng)該有相關(guān)注釋,在 package 語句之前的注釋內(nèi)容將被默認(rèn)認(rèn)為是這個包的文檔, package 的注釋應(yīng)該提供一些相關(guān)信息并對整體功能做簡要的介紹。
在日常開發(fā)過程中,可以使用go doc和godoc命令生成代碼的文檔。
go doc
go doc 命令打印Go語言程序?qū)嶓w上的文檔。可以使用參數(shù)來指定程序?qū)嶓w的標(biāo)識符。
Go語言程序?qū)嶓w是指變量、常量、函數(shù)、結(jié)構(gòu)體以及接口。
程序?qū)嶓w標(biāo)識符就是程序?qū)嶓w的名稱。
go doc 用法
go doc [-u] [-c] [package|[package.]symbol[.methodOrField]]
可用的標(biāo)識:
標(biāo)識 | 說明 |
---|---|
-all | 顯示所有文檔 |
-c | 匹配程序?qū)嶓w時,大小寫敏感 |
-cmd | 將命令(main包)視為常規(guī)程序包,如果要顯示main包的doc,請指定這個標(biāo)識 |
-src | 顯示完整源代碼 |
-u | 顯示未導(dǎo)出的程序?qū)嶓w |
示例
輸出指定 package ,指定類型,指定方法的注釋
$ go doc sync.WaitGroup.Add
輸出指定 package ,指定類型的所有程序?qū)嶓w,包括未導(dǎo)出的
$ go doc -u -all sync.WaitGroup
輸出指定 package 的所有程序?qū)嶓w(非所有詳細(xì)注釋)
$ go doc -u sync
godoc
godoc命令主要用于在無法聯(lián)網(wǎng)的環(huán)境下,以web形式,查看Go語言標(biāo)準(zhǔn)庫和項目依賴庫的文檔。
在 go 1.12 之后的版本中,godoc不再做為go編譯器的一部分存在。依然可以通過go get命令安裝:
go get -u -v golang.org/x/tools/cmd/godoc
國內(nèi)的安裝方法
mkdir -p $GOPATH/src/golang.org/x cd $GOPATH/src/golang.org/x git clone https://github.com/golang/tools.git cd tools/cmd/godoc go install ls -alh $GOPATH/bin
通過終端查看文檔
go doc命令
$ go doc help
usage: go doc [-u] [-c] [package|[package.]symbol[.method]]
可以看到,go doc接受的參數(shù),可以是包名,也可以是包里的結(jié)構(gòu)、方法等,默認(rèn)為顯示當(dāng)前目錄下的文檔。
查看系統(tǒng)log包信息
linux@ubuntu:/usr/local/go/src/log$ go doc package log // import "log" Package log implements a simple logging package. It defines a type, Logger, with methods for formatting output. It also has a predefined 'standard' Logger accessible through helper functions Print[f|ln], Fatal[f|ln], and Panic[f|ln], which are easier to use than creating a Logger manually. That logger writes to standard error and prints the date and time of each logged message. Every log message is output on a separate line: if the message being printed does not end in a newline, the logger will add one. The Fatal functions call os.Exit(1) after writing the log message. The Panic functions call panic after writing the log message. const Ldate = 1 << iota ... func Fatal(v ...interface{}) func Fatalf(format string, v ...interface{}) func Fatalln(v ...interface{}) func Flags() int func Output(calldepth int, s string) error func Panic(v ...interface{}) func Panicf(format string, v ...interface{}) func Panicln(v ...interface{}) func Prefix() string func Print(v ...interface{}) func Printf(format string, v ...interface{}) func Println(v ...interface{}) func SetFlags(flag int) func SetOutput(w io.Writer) func SetPrefix(prefix string) type Logger struct{ ... } func New(out io.Writer, prefix string, flag int) *Logger
列出當(dāng)前包中方法、結(jié)構(gòu)、常量等
查看系統(tǒng)log包中Fatal方法
linux@ubuntu:/usr/local/go/src/log$ go doc log.Fatal func Fatal(v ...interface{}) Fatal is equivalent to Print() followed by a call to os.Exit(1).
列出當(dāng)前函數(shù)和注釋說明
查看系統(tǒng)log包中Logger結(jié)構(gòu)
linux@ubuntu:/usr/local/go/src/log$ go doc Logger type Logger struct { // Has unexported fields. } A Logger represents an active logging object that generates lines of output to an io.Writer. Each logging operation makes a single call to the Writer's Write method. A Logger can be used simultaneously from multiple goroutines; it guarantees to serialize access to the Writer. func New(out io.Writer, prefix string, flag int) *Logger func (l *Logger) Fatal(v ...interface{}) func (l *Logger) Fatalf(format string, v ...interface{}) func (l *Logger) Fatalln(v ...interface{}) func (l *Logger) Flags() int func (l *Logger) Output(calldepth int, s string) error func (l *Logger) Panic(v ...interface{}) func (l *Logger) Panicf(format string, v ...interface{}) func (l *Logger) Panicln(v ...interface{}) func (l *Logger) Prefix() string func (l *Logger) Print(v ...interface{}) func (l *Logger) Printf(format string, v ...interface{}) func (l *Logger) Println(v ...interface{}) func (l *Logger) SetFlags(flag int) func (l *Logger) SetOutput(w io.Writer) func (l *Logger) SetPrefix(prefix string)
列出Logger結(jié)構(gòu)定義以及Logger結(jié)構(gòu)操作的方法集
通過網(wǎng)頁查看文檔
godoc命令
$ godoc -http=:6060
godoc會監(jiān)聽6060端口,通過網(wǎng)頁訪問 http://127.0.0.1:6060,godoc基于GOROOT和GOPATH路徑下的代碼生成文檔的。打開首頁如下,我們自己項目工程文檔和通過go get的代碼文檔都在Packages中的Third party里面。
編寫自己的文檔
1、設(shè)計接口函數(shù)代碼
創(chuàng)建documents/calc.go文件
/* 簡易計算器計算自定義包 */ package documents // 一種實現(xiàn)兩個整數(shù)相加的函數(shù), // 返回值為兩整數(shù)相加之和 func Add(a, b int) int { return a + b } // 一種實現(xiàn)兩個整數(shù)相減的函數(shù), // 返回值為兩整數(shù)相減之差 func Sub(a, b int) int { return a - b } // 一種實現(xiàn)兩個整數(shù)相乘的函數(shù), // 返回值為兩整數(shù)相乘之積 func Mul(a, b int) int { return a * b } // 一種實現(xiàn)兩個整數(shù)相除的函數(shù), // 返回值為兩整數(shù)相除之商 func Div(a, b int) int { if b == 0 { panic("divide by zero") } return a / b }
2、設(shè)計Example示例代碼
創(chuàng)建documents/calc_test.go文件,給calc.go中每個函數(shù)編寫Example函數(shù)
package documents import ( "fmt" ) func ExampleAdd() { result := Add(4, 2) fmt.Println("4 + 2 =", result) // Output: // 4 + 2 = 6 } func ExampleSub() { result := Sub(4, 2) fmt.Println("4 - 2 =", result) // Output: // 4 - 2 = 2 } func ExampleMul() { result := Mul(4, 2) fmt.Println("4 * 2 =", result) // Output: // 4 * 2 = 8 } func ExampleDiv() { result := Div(4,2) fmt.Println("4 / 2 =", result) // Output: // 4 / 2 = 2 }
3、網(wǎng)頁查看文檔
注意以上兩個文件必須在$GOPATH/src路徑下,使用godoc命令創(chuàng)建文檔,用網(wǎng)頁打開顯示如下
編寫文檔規(guī)則
1、文檔中顯示的詳細(xì)主體內(nèi)容,大多是由用戶注釋部分提供,注釋的方式有兩種,單行注釋"http://"和代碼塊"/* */"注釋。
2、在源碼文件中,在package語句前做注釋,在文檔中看到的就是Overview部分, 注意:此注釋必須緊挨package語句前一行,要作為Overview部分的,注釋塊中間不能有空行。
3、在函數(shù)、結(jié)構(gòu)、變量等前做注釋的,在文檔中看到的就是該項詳細(xì)描述。注釋規(guī)則同上。
4、編寫的Example程序,函數(shù)名必須以Example為前綴,可將測試的輸出結(jié)果放在在函數(shù)尾部,以"http:// Output:"另起一行,然后將輸出內(nèi)容注釋,并追加在后面。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
在?Go?語言中使用?regexp?包處理正則表達(dá)式的操作
正則表達(dá)式是處理字符串時一個非常強(qiáng)大的工具,而?Go?語言的?regexp?包提供了簡單而強(qiáng)大的接口來使用正則表達(dá)式,本文將介紹如何在?Go?中使用?regexp?包來編譯和執(zhí)行正則表達(dá)式,以及如何從文本中匹配和提取信息,感興趣的朋友一起看看吧2023-12-12讓go程序以后臺進(jìn)程或daemon方式運(yùn)行方法探究
本文探討了如何通過Go代碼實現(xiàn)在后臺運(yùn)行的程序,最近我用Go語言開發(fā)了一個WebSocket服務(wù),我希望它能在后臺運(yùn)行,并在異常退出時自動重新啟動,我的整體思路是將程序轉(zhuǎn)為后臺進(jìn)程,也就是守護(hù)進(jìn)程(daemon)2024-01-01