我正在自学一些 Go(最后),在此过程中,我尝试从本地文件为自己编写一个 M3U 解析器。
每个文件包含 2 行流分组...
第一行是包含所有正确 M3u 属性的数据,第二行是流本身的 URl。
我想做的是创建一个结构来将这个“数据”存储在2个字段中
// our m3u line structure
type M3UStructure struct {
data string
stream string
}
因此,我想出了以下方法来逐行读取 M3U 文件,并抓取每 2 行,跳过潜在的空白行。
// open the file for reading
_file, err := os.Open( _the_file )
if err != nil {
// log
log.Fatalf( "[ERROR] Opening File: %v", err )
// return the error
return err
}
// close it
defer _file.Close( )
// setup a scanner
_scanner := bufio.NewScanner( _file )
if err := _scanner.Err(); err != nil {
// log
log.Fatalf( "[ERROR] Reading File: %v", err )
// return the error
return err
}
// hold the lines we'll need
_lines := []types.M3UStructure{}
// hold an index
_idx := 0
// loop over the scan
for _scanner.Scan( ) {
// hold the line
_line := _scanner.Text( )
// hold the line fields
_line_fields := strings.Fields( _line )
// if the line is not blank
if _line != "" {
// if the line is the second line
if _idx % 2 == 0 {
// store the url
_lines = append( _lines, string{"stream" : _line_fields[0]} )
//log.Printf( "[INFO] Line - STREAM: %v", _line )
// otherwise
} else {
// append the data
_lines = append( _lines, string{"data" : _line_fields[0]} )
//log.Printf( "[INFO] Line - DATA: %v", _line )
}
}
//log.Printf( "[DEBUG] FIELDS: %v", _line_fields )
// increment the index
_idx ++
}
log.Printf( "[DEBUG] LINES: %v", _lines )
这不起作用,把我
invalid composite literal type string
扔到append
线上。
我很困惑...如何将每个“线对”中的第一行添加到结构的
data
值,然后将第二行添加到结构的 stream
值?以 data
和 stream
的有效结构列表结尾? (我现在想做的就是证明我拥有它......一旦可以,我计划稍后进一步解析该结构的数据)
Append 实际上不是这样工作的。
_lines = append(_lines, M3UStructure{stream: _line_fields[0]})
您必须创建在
var lines []structure
中声明的结构。
所以
if _idx%2 == 0 {
_lines = append(_lines, M3UStructure{stream: _line_fields[0]})
} else {
_lines = append(_lines, M3UStructure{data: _line_fields[0]})
}
效果很好。 https://go.dev/play/p/D40vmsXRR6g 嘟嘟