Golang中的一些关键字(defer、:=、go func())

作者:非妃是公主
专栏:《Golang》
博客主页https://blog.csdn.net/myf_666
个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩
在这里插入图片描述

一、defer

defer表示延迟调用,在程序返回前进行调用。

如果程序中存在多个defer,调用顺序类似于栈,后定义的先执行,先定义的后执行。


二、var与 := 的区别

1. var

  1. 声明变量,如下:
// 定义一个名称为“variableName”,类型为"type"的变量
// var variableName type
var number int
  1. 定义并初始化变量
// 初始化“variableName”的变量为“value”值,类型是“type”
// var variableName type = value
var number int = 10
  1. 同时定义并初始化多个变量——平行赋值
/* 定义三个类型都是"type"的变量,并且分别初始化为相应的值
    vname1为v1,vname2为v2,vname3为v3
    */
// var vname1, vname2, vname3 type = v1, v2, v3
var number1, number2, number3 int = 1, 2, 3

2. :=

相比于var,:=的有点是,可以自动推导变量类型,如下:

/* 
定义三个变量,它们分别初始化为相应的值    
vname1为v1,vname2为v2,vname3为v3    
编译器会根据初始化的值自动推导出相应的类型
*/
// vname1, vname2, vname3 := v1, v2, v3
number1, number2, number3 := 1, 2, 3

3. 二者区别

:=这个符号直接取代了vartype,这种形式叫做简短声明。但是,值得注意的是,它只能用在函数内部;在函数外部使用则会无法编译通过,所以一般用var方式来定义全局变量。

换句话说,“:=”只能在声明“局部变量”的时候使用,而“var”没有这个限制。1


三、go func

go关键字,相当于新开一个线程,在go语言中叫做goroutine。由于是新开一个线程,所以它的运行与主线程是并行的。具体可以看如下的示例程序:

package main

import (
	"fmt"
	"time"
)

func main() {
	go spinner(100 * time.Millisecond)
	const n = 45
	fibN := fib(n) // slow
	fmt.Printf("\rFibonacci(%d) = %d\n", n, fibN)
}

func spinner(delay time.Duration) {
	for {
		for _, r := range `-\|/` {
			fmt.Printf("\r%c", r)
			time.Sleep(delay)
		}
	}
}

func fib(x int) int {
	if x < 2 {
		return x
	}
	return fib(x-1) + fib(x-2)
}

这是一个计算斐波那契的程序,计算第45项的值。由于采用递归算法进行实现,这需要耗费一定的时间,我们通过spinner函数,来新开辟1个线程(或者称为goroutine)来动态的显示程序的运行状态。

程序运行结果如下:
在这里插入图片描述

最终输出结果如下:

在这里插入图片描述

值得注意的是,语句fmt.Printf("\r%c", r)中的"\r%c"作用是:字符串格式化语句,在行首不断输出字符,由于是在行首,所以不断覆盖,不会向后输出,产生了原地旋转小车轮的动态效果。

其中,"\n"是换行符,"\r"是回车符(返回行首),由于我们轮流输出"-\|/",因此产生动态的效果。关于"\r"的详细介绍可以参考:https://blog.csdn.net/myf_666/article/details/128731608


  1. https://www.php.cn/be/go/439542.html ↩︎

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
要将音频数据从原始格式转换为WAV格式,您需要使用一个音频处理库。其一个流行的库是 `go-sox`,它使用SoX音频处理工具的接口。以下是一个将原始音频数据转换为WAV格式的示例代码: ```go package main import ( "io" "os" "os/exec" "github.com/krig/go-sox" ) func main() { inputFilename := "audio.raw" outputFilename := "audio.wav" // 读取原始音频数据 inputFile, err := os.Open(inputFilename) if err != nil { panic(err) } defer inputFile.Close() // 使用 io.ReadAll() 函数读取音频数据 audioData, err := io.ReadAll(inputFile) if err != nil { panic(err) } // 创建 SoX 对象 sox := sox.New() // 创建输入流 input := sox.OpenMem(audioData) // 创建输出流 output := sox.CreateFile(outputFilename, input.FileSignal()) // 配置输出流格式 outputSignal := sox.Signal{ Channels: input.Signal().Channels, Rate: input.Signal().Rate, Precision: 16, } output.SetSignal(outputSignal) // 创建转换链 transform := sox.CreateEffect(sox.FindEffect("input")) transform.AddInput(input) transform.AddOutput(output) // 运行转换 err = transform.Flow() if err != nil { panic(err) } // 关闭流 input.Release() output.Release() // 使用 ffmpeg 转换 WAV 格式 cmd := exec.Command("ffmpeg", "-i", outputFilename, "-acodec", "pcm_s16le", "-ar", "16000", outputFilename) err = cmd.Run() if err != nil { panic(err) } } ``` 这个示例代码使用了 `io.ReadAll()` 函数从文件读取音频数据,然后使用 `go-sox` 库将其转换为WAV格式。最后,使用 `ffmpeg` 工具将输出文件转换为所需的PCM_S16LE格式。您需要确保在系统上安装了 `ffmpeg` 工具。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cherries Man

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值