《Go语言编程》第三章完整示例问题

最近在学习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=err1
return
}
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吧。
倚天杖
浏览 334回答 2
2回答

蝴蝶不菲

鄙人觉得remove函数这样写会更好一些m.musics=append(m.musics[:index],m.musics[index+1:]...)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript