Go练习题—动态打印歌词

栏目: Python · 发布时间: 5年前

内容简介:15年我开始学代码实现起来基本上是非常简单的,由以下几步组成:

背景

15年我开始学 Python 的时候,写的第一个练习题就是 Python练习题—动态打印歌词 。现在开始学习 Golang ,也沿用原来的学习路线,实现一下打印歌词

实现思路

代码实现起来基本上是非常简单的,由以下几步组成:

  • 读取文件
  • 逐行解析出时间和歌词
  • 循环读取解析数据,然后根据时间计算时间差来等待
  • 等待完成后打印歌词

代码

package main

import (
    "fmt"
    "os"
    "io/ioutil"
    "strings"
    "strconv"
    "time"
)

func main() {
    var iLastTime int
    data, _ := ReadFile("gechi.txt")
    lines := strings.Split(string(data), "\n")
    fmt.Println("开始播放")
    for i := 0; i < len(lines); i++ {
        sTime, content := ParseOneLrc(lines[i])
        iTime, _ := strconv.Atoi(sTime)
        time.Sleep(time.Duration(iTime-iLastTime) * time.Millisecond)
        iLastTime = iTime
        fmt.Println(content)
    }
    fmt.Println("停止播放")
}

// 根据传入的地址读取歌词文件。
// 返回byte类型,如果需要转字符串,则需要使用string()方法转为字符串
func ReadFile(path string) ([]byte, error) {
    f, err := os.Open(path)
    if err != nil {
        return nil, err
    }
    data, err := ioutil.ReadAll(f)
    f.Close()
    return data, err
}

// 解析一行歌词
// 返回字符类型的时间和歌词内容
func ParseOneLrc(lrc string) (extime, content string) {
    tmp := strings.Split(lrc, "]")
    first, second := tmp[0], tmp[1]
    extime = strconv.Itoa(Str2Ms(first[1:]))
    content = second
    return extime, content
}

// 把歌词的时间转成毫秒
// 返回int类型的毫秒
func Str2Ms(t string) int {
    tmp1 := strings.Split(t, ":")
    tMin := tmp1[0]
    tmp2 := strings.Split(tmp1[1], ".")
    tSecond := tmp2[0]
    tMs := tmp2[1]
    ms, _ := strconv.Atoi(tMs)
    min, _ := strconv.Atoi(tMin)
    second, _ := strconv.Atoi(tSecond)
    ms = ms + min*60*1000 + second*1000
    return ms
}

几个关键点记录

  • 类型转换

Golang 是强类型语言,相比于 Python 来说,写起来要非常注意这个问题,好在大部分类型不正确的问题IDE都会提示我们

strconv.Atoi 可以把字符串转为 int ,同理 strconv.Itoa 可以把 int 转为字符串

  • 多返回值和错误

Golang 中是支持多返回值的,但是 Golang 中的错误处理不想 PythonJava 那样用 try 来处理,而是把 err 这种错误信息用一个返回值来返回,所以经常调用内建库的时候,要注意使用这样的代码来处理错误:

f, err := os.Open(path)
    if err != nil {
        return nil, err
    }

如果需要忽略这个错误的话,就需要借助一个 _ 来处理,比如: data, _ := ReadFile("gechi.txt")

  • 读取文件返回字节

调用 ioutil.ReadAll(f) 读取文件的时候,返回的是一个 []byte 类型,打印出来则是这样的:

[91 48 48 58 48 49 46 51 52 93 230 136 144 233 131 189 10 91 48 48]

如果需要转为字符串,则需要使用 string([]byte)

  • time.Sleep 方法传值比较蛋疼

如果用 Python 来实现睡眠,只要 time.sleep() 方法,在 sleep 中直接传参具体的数字即可实现等待。而 Golang 中略微蛋疼,比如我们要按微秒来休眠,则要这样:

time.Sleep(time.Duration(iTime-iLastTime) * time.Millisecond)

如果是要休眠秒,则需要乘以 time.Second 。使用起来略微麻烦

  • 其他

Golang 的命名规范是驼峰式命名,而 Python 则建议以蛇形命名。

要定义变量并赋值,使用语法 a := 1 ,如果要赋值的是函数的返回值,则直接使用 a = 1 即可,在定义了返回值就表示变量已经被声明了。

Golang 的注释是放在函数名的上方,而 Python 是放在函数体内。


以上所述就是小编给大家介绍的《Go练习题—动态打印歌词》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

产品经理手册(原书第4版)(白金版)

产品经理手册(原书第4版)(白金版)

[美] 琳达·哥乔斯(Linda Gorchels) / 祝亚雄、冯华丽、金骆彬 / 机械工业出版社 / 2017-8 / 65.00

产品经理的职责起点是新产品开发,贯穿产品生命周期的全过程。本书按上下游产品管理进行组织。 在上游的新产品开发流程中,作者阐述了如何从市场、产品、行业、公司的角度规划企划方案,并获得老板、销售部、运营部的资源支持,推进新产品的项目流程,实现所有目标,制定和实施新产品发布。 下游产品的管理核心在于生命周期的管理,营销更是生命周期管理的重中之重。产品经理如何让产品满足客户需求,让客户获得对产......一起来看看 《产品经理手册(原书第4版)(白金版)》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

SHA 加密
SHA 加密

SHA 加密工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具