最近在学习Go语言,看的书是《Go语言编程》许式伟 七牛团队的。我基本会把书上的例子都会练习一遍,当是一种学习方法。当然也会遇到一点问题,没事可以骚扰下许式伟。
先补充下第二章中的疑问(应sf的要求在这里面进行提问)
第二章中的完整事例其中有一段:
for{
line,isPrefix,err1 := br.ReadLine()
if err1 != nil {
if err1 != io.EOF{
err = err1
}
break
}
if isPrefix{
fmt.Println( "A too long line,seems unexpectd." )
return
}
str := string( line )
value,err1:=strconv.Atoi( str )
if err1 != nil{
err = err1
return
}
values = append( values,value )
}
下面这段代码开始看的时候 觉得err1相关的代码非常多余,因为都会返回err,当然我想当然了。如果不使用新的变量会报如下的错误
err1 ./sorter.go:37: err is shadowed during return
@许式伟 帮我解答了 “意思是里层的err把外层的err屏蔽了。”
=================================================================================
现在第三章的完整示例代码,我已经测试了,发现如下几个问题:
PS:有此应该是作者预留的,有些不知道是不是笔误,所以请 @许式伟 查看下
- manager.go一开始的 musics []MusicEntry 这个struct名字和上文中的不一样
- 并没有提供WAVPlayer{}当然这个得自己写 应该是预留的 只是做了一个mp3的示例
- 在manager_test.go 最后一个 t.Error( "MusicManager.Remove() failed.",err ) 应该是没有err的
- 主程序中remove <name> 使用的是RemoveByName 并没有这个方法 ,我将方法Find和Remove结合写了一个RemoveByName,但是Remove是index并不是id,这里我还没有调试,我觉得可能按id删除会比较好。
- 在主程序播放位置mp.Play(e.Source,e.Type,ctrl,signal) 应该是作者预留了两个ctrl控制和signal信号。
- 在主程序lib add 的时候id++ 应该放置在lib.Add之后,这样第一个添加的才是id为1不然就成了2了
总体来说这个示例是不完全可用的,但作者在最后演示的时候是正常的,我不知道是印刷的问题还是故意这样编排的。
================================================================
再补充两个问题:
- 上次忘说了在这段示例里面有几个地方用了elseif go应该不支持这样写吧
- 另外在Remove方法里面,应该是有逻辑问题的,会报out of range的问题。我按原来的思路修改如下:
func ( m *MusicManager)Remove( index int ) *MusicEntry {
if index <0 || index >= len( m.musics ){
return nil
}
removeMusic := &m.musics[index]
if index == 0 {
m.musics = m.musics[index+1:]
} else if index == len( m.musics)-1 {
m.musics = m.musics[:index]
}else {
m.musics = append( m.musics[:index],m.musics[index+1:]... )
}
return removeMusic
}
如果不用slice切片的方法,应该有更简洁的办法来删除range的index吧。