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