a5声卡混响有杂音环绕,混响,回声,重低音是什么意思

博客访问: 124753
博文数量: 22
博客积分: 250
博客等级: 二等列兵
技术积分: 466
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Web开发
1. 指针作为函数参数
go语言中指针作为函数参数时基本和C语言相同。先看代码
package main
func UpdateA(x int) {
func UpdateB(x *int) {
//x = 5 //compile error
func main() {
UpdateA(a)
fmt.Printf("a = %d\n", a)
&& //UpdateB(b) //compile error
UpdateB(&b)
fmt.Printf("b = %d\n", b)
# go run func.go
2. 方法中的指针
go语言的结构体类似于C++中的类,可以包含属性和方法。
package main
type Cat struct {
func (cat Cat) Age() int {
return cat.age
代码中创建了一个Cat结构体,其中age是结构体的属性,Age()是结构体方法。
给对象分配内存可以用如下几种方式:
cat := new(Cat) //返回Cat对象指针
cat := &Cat{1} //内部会调用new(Cat),返回Cat对象指针
cat := Cat{1} //返回Cat对象
但是,如果Cat结构体中有指针方法,就只能创建Cat对象指针
给上面的Cat结构体添加一个指针方法:
func (cat *Cat) SetAge(x int) {
cat.age = x
go编译器规定此时只能创建Cat对象指针,如果创建Cat对象会出错:
cat := Cat{1} //compile error
3. 调用方法时的指针使用
对于方法的调用,go和C++不同,go比较智能,指针方法和值方法都可以通过指针或非指针对象调用。例如:
type Cat struct {
func (cat Cat) Age() int {
return cat.age
func main() {
cat := new(Cat) //返回Cat对象指针
age := cat.Age()//同age := (*cat).Age()
fmt.Printf("%d\n", age)
代码中定义了结构体Cat的Age()方法,通过关键词new生成一个Cat对象指针,我们可以通过cat.Age()或(*cat).Age()访问Age()方法。
如果代码修改成:
func (cat *Cat) Age() int {
return cat.age
func main() {
cat := Cat{age:1} //返回Cat对象
age := cat.Age()//同age := (&cat).Age()
fmt.Printf("%d\n", age)
结构体Cat定义了指针方法Age(),main()函数中生成了一个Cat的对象cat,可以通过cat.Age()或(&cat).Age()访问Age()指针方法。
可见,go语言中结构体调用方法是很灵活的,编译过程中会自动完成转换。
4. 指针方法和值方法
和函数类似,指针方法可以修改结构体中的属性值,值方法由于传递的参数是结构体对象的副本,不能改变其属性值。测试代码如下:
package main
type Cat struct {
func (cat Cat) Age() int {
return cat.age
func (cat Cat) SetAge(x int) {
cat.age = x
type Dog struct {
func (dog Dog) Age() int {
return dog.age
func (dog *Dog) SetAge(x int) {
dog.age = x
func main() {
cat := new(Cat)
cat.SetAge(5)
fmt.Printf("%d\n", cat.Age())
dog := new(Dog)
dog.SetAge(5)
&& fmt.Printf("%d\n", dog.Age())
# go run struct.go
cat的age没被修改,所以是默认初始值0,dog的age被修改了。
以上就是go语言中指针使用的简单说明,总体来说go的指针处理比C语言规则更宽松,但个人感觉这反而容易让初学者混淆。
阅读(1109) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。你正在使用的浏览器版本过低,将不能正常浏览和使用知乎。Go语言 传值和传指针性能对比
- Go语言中文网 - Golang中文社区
<meta name="author" content="polaris ">
Go语言 传值和传指针性能对比
· 3606 次点击 ·
开始浏览 & &
转载自达达的博客
以往的C编程经验告诉我们,指针传参会有更好的性能,在Go语言中,这条经验也是通用的。但是需要留意两个问题:
指针传参会导致参数的操作领域不确定,到底函数内部会不会改变传入的对象呢?Go语言中没有类型C那样的const关键字,所以无法控制。Go语言是有GC的,并且这个GC还不是很完善,受对象数量影响较大,传递指针意味着可能多创建不必要的对象,到底指针传参带来的性能提升能不能抵消创建对象产生的GC压力呢?这是一个不好观察到的数据。(原作者达达这里应该是有错误的,首先传值也是复制,要产生一个新对象,分配内存地址传到新的函数中,其次指针一般来说64个字节,复制的代价远小大中型数据传值,因此在都产生一个新对象的情况下,指针还是远优先于传大中型的值结构)
下面是性能消耗的测试代码:
package labs02
import &#34;testing&#34;
type BigStruct struct {
C01 uint64
C02 uint64
C03 uint64
C04 uint64
C05 uint64
C06 uint64
C07 uint64
C08 uint64
C09 uint64
C10 uint64
C11 uint64
C12 uint64
C13 uint64
C14 uint64
C15 uint64
C16 uint64
C17 uint64
C18 uint64
C19 uint64
C20 uint64
C21 uint64
C22 uint64
C23 uint64
C24 uint64
C25 uint64
C26 uint64
C27 uint64
C28 uint64
C29 uint64
C30 uint64
func Invoke1(a *BigStruct) uint64 {
return a.C30
func Invoke2(a BigStruct) uint64 {
return a.C30
func Benchmark_Invoke1(b *testing.B) {
var a = new(BigStruct)
for i := 0; i & b.N; i++ {
Invoke1(a)
func Benchmark_Invoke2(b *testing.B) {
var a = BigStruct{}
for i := 0; i & b.N; i++ {
Invoke2(a)
测试值传参和指针传参的效率。
实验结果:
dada-imac:misc dada$ go test -test.bench=&#34;.&#34; labs02
testing: warning: no tests to run
Benchmark_Invoke1
0.52 ns/op
Benchmark_Invoke2
12.8 ns/op
3606 次点击 &
请尽量让自己的回复能够对别人有帮助
支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
支持 @ 本站用户;支持表情(输入 : 提示),见
记住登录状态
转载自达达的博客
以往的C编程经验告诉我们,指针传参会有更好的性能,在Go语言中,这条经验也是通用的。但是需要留意两个问题:
指针传参会导致参数的操作领域不确定,到底函数内部会不会改变传入的对象呢?Go语言中没有类型C那样的const关键字,所以无法控制。Go语言是有GC的,并且这个GC还不是很完善,受对象数量影响较大,传递指针意味着可能多创建不必要的对象,到底指针传参带来的性能提升能不能抵消创建对象产生的GC压力呢?这是一个不好观察到的数据。(原作者达达这里应该是有错误的,首先传值也是复制,要产生一个新对象,分配内存地址传到新的函数中,其次指针一般来说64个字节,复制的代价远小大中型数据传值,因此在都产生一个新对象的情况下,指针还是远优先于传大中型的值结构)
下面是性能消耗的测试代码:
package labs02
import &#34;testing&#34;
type BigStruct struct {
C01 uint64
C02 uint64
C03 uint64
C04 uint64
C05 uint64
C06 uint64
C07 uint64
C08 uint64
C09 uint64
C10 uint64
C11 uint64
C12 uint64
C13 uint64
C14 uint64
C15 uint64
C16 uint64
C17 uint64
C18 uint64
C19 uint64
C20 uint64
C21 uint64
C22 uint64
C23 uint64
C24 uint64
C25 uint64
C26 uint64
C27 uint64
C28 uint64
C29 uint64
C30 uint64
func Invoke1(a *BigStruct) uint64 {
return a.C30
func Invoke2(a BigStruct) uint64 {
return a.C30
func Benchmark_Invoke1(b *testing.B) {
var a = new(BigStruct)
for i := 0; i & b.N; i++ {
Invoke1(a)
func Benchmark_Invoke2(b *testing.B) {
var a = BigStruct{}
for i := 0; i & b.N; i++ {
Invoke2(a)
测试值传参和指针传参的效率。
实验结果:
dada-imac:misc dada$ go test -test.bench=&#34;.&#34; labs02
testing: warning: no tests to run
Benchmark_Invoke1
0.52 ns/op
Benchmark_Invoke2
12.8 ns/op
224 人在线
&最高记录 1134
&2012- Go语言中文网,中国 Golang 社区,致力于构建完善的 Golang 中文社区,Go语言爱好者的学习家园。
Powered by
&o&服务器由
赞助 &·&CDN 由
VERSION: V3.0.0&·&5.811383ms&·&为了更好的体验,本站推荐使用 Chrome 或 Firefox 浏览器
登录和大家一起探讨吧
记住登录状态
还不是会员golang struct结构体方法中的参数需要定义为指针类型
- Go语言中文网 - Golang中文社区
<meta name="author" content="polaris ">
golang struct结构体方法中的参数需要定义为指针类型
· 2032 次点击 ·
开始浏览 & &
前几日写一个网页的简单计数器问题时发现,计数器居然永远为0,计数器不计数,见鬼了。。。
代码如下:
type Counter struct {
func (ctr Counter) ServeHTTP(c http.ResponseWriter, req *http.Request) {
fmt.Fprintf(c, &#34;%08x\n&#34;, ctr)
fmt.Fprintf(c, &#34;counter = %d\n&#34;, ctr.n)
func main() {
http.Handle(&#34;/counter&#34;, new(Counter))
log.Fatal(&#34;ListenAndServe: &#34;, http.ListenAndServe(&#34;:80&#34;, nil))
研究一番,发现我们
func (ctr Counter) ServeHTTP(c http.ResponseWriter, req *http.Request)
func (ctr* Counter) ServeHTTP(c http.ResponseWriter, req *http.Request)
也就是说,对象的实例必须定义为指针的类型,然后才能传递正确的地址,否则ctr参数只是对象的一个副本,
于是修正代码为:
type Counter struct {
func (ctr *Counter) ServeHTTP(c http.ResponseWriter, req *http.Request) {
fmt.Fprintf(c, &#34;%08x\n&#34;, ctr)
fmt.Fprintf(c, &#34;counter = %d\n&#34;, ctr.n)
func main() {
http.Handle(&#34;/counter&#34;, new(Counter))
log.Fatal(&#34;ListenAndServe: &#34;, http.ListenAndServe(&#34;:80&#34;, nil))
计数器终于计数了。。。
总结:golang隐式传递指针,但是不隐式定义指针,此坑需同学们注意。
2032 次点击 &?& 1 赞 &
请尽量让自己的回复能够对别人有帮助
支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
支持 @ 本站用户;支持表情(输入 : 提示),见
记住登录状态
前几日写一个网页的简单计数器问题时发现,计数器居然永远为0,计数器不计数,见鬼了。。。
代码如下:
type Counter struct {
func (ctr Counter) ServeHTTP(c http.ResponseWriter, req *http.Request) {
fmt.Fprintf(c, &#34;%08x\n&#34;, ctr)
fmt.Fprintf(c, &#34;counter = %d\n&#34;, ctr.n)
func main() {
http.Handle(&#34;/counter&#34;, new(Counter))
log.Fatal(&#34;ListenAndServe: &#34;, http.ListenAndServe(&#34;:80&#34;, nil))
研究一番,发现我们
func (ctr Counter) ServeHTTP(c http.ResponseWriter, req *http.Request)
func (ctr* Counter) ServeHTTP(c http.ResponseWriter, req *http.Request)
也就是说,对象的实例必须定义为指针的类型,然后才能传递正确的地址,否则ctr参数只是对象的一个副本,
于是修正代码为:
type Counter struct {
func (ctr *Counter) ServeHTTP(c http.ResponseWriter, req *http.Request) {
fmt.Fprintf(c, &#34;%08x\n&#34;, ctr)
fmt.Fprintf(c, &#34;counter = %d\n&#34;, ctr.n)
func main() {
http.Handle(&#34;/counter&#34;, new(Counter))
log.Fatal(&#34;ListenAndServe: &#34;, http.ListenAndServe(&#34;:80&#34;, nil))
计数器终于计数了。。。
总结:golang隐式传递指针,但是不隐式定义指针,此坑需同学们注意。
224 人在线
&最高记录 1134
&2012- Go语言中文网,中国 Golang 社区,致力于构建完善的 Golang 中文社区,Go语言爱好者的学习家园。
Powered by
&o&服务器由
赞助 &·&CDN 由
VERSION: V3.0.0&·&5.025294ms&·&为了更好的体验,本站推荐使用 Chrome 或 Firefox 浏览器
登录和大家一起探讨吧
记住登录状态
还不是会员C/C++编程开发(23)
-------------------------golang----------------------------------------------
package main
import "fmt"
func A(m int, n []int) {
fmt.Printf("After : &m=%p,&n=%p,n=%p\n", &m, &n, n)
fmt.Printf("
m=%d,n=%v\n", m, n)
func main() {
n := []int{1, 2, 3}
fmt.Printf("-----------origin--------------------\n")
fmt.Printf("Befter : &m=%p,&n=%p,n=%p\n", &m, &n, n)
fmt.Printf("
m=%d,n=%v\n", m, n)
fmt.Printf("-----------call A--------------------\n")
fmt.Printf("------------end-------------------\n")
fmt.Printf("End : &m=%p,&n=%p,n=%p\n", &m, &n, n)
fmt.Printf("
m=%d,n=%v\n", m, n)
运行结果:
Before : &m=0x7ffcf9f5de48,&n=0x7ffcf9f5de40,n=0xcf1010
Call A: &m =0x7ffcf9f5de2c,&n=0x7ffcf9f5de20,n =0xcf1010
After : &m=0x7ffcf9f5de48,&n=0x7ffcf9f5de40,n=0xcf1010
1.调用A函数是把n的值(并非是n指向的内容,而是指针的值)在函数内开辟空间复制下来。
2.A函数中的n和main中的存储n的内存地址是不一样的,但是都是存储了n的值(n是指针)。
3.A函数任何传递非指针、非引用的参数,都会在A函数的函数栈内开辟空间复制这个值,如果是数组,都会复制该数组在该函数,一旦退出该函数,针对A函数对m的操作都会实现,因为A函数内的m是对A函数参数m的复制,并非原始数据。
--------------------------------C------------------------------------
/*************************************************************************
& File Name: test.c
& Author: perrynzhou
& Created Time: Sat 24 Sep :00 AM HKT
************************************************************************/
void A(int m,int *n)
fprintf(stdout,"Call A: &m =%p,&n=%p,n =%p\n",&m,&n,n);
int main(void)
int m = 30;
int size = 3,i;
int *n = (int *)malloc(sizeof(int)*size);
n[0] = 99;
n[2] = 88;
fprintf(stdout,"Before : &m=%p,&n=%p,n=%p\n",&m,&n,n);
fprintf(stdout,"After : &m=%p,&n=%p,n=%p\n",&m,&n,n);
if(n != NULL){
运行结果:
Before : &m=0x7ffe1e7f3058,&n=0x7ffe1e7f3050,n=0x6a3010
Call A: &m =0x7ffe1e7f303c,&n=0x7ffe1e7f3030,n =0x6a3010
After : &m=0x7ffe1e7f3058,&n=0x7ffe1e7f3050,n=0x6a3010
最终结论:
***和Golang中是一致的哦!!结论和golang中是一致的哦!!!***
1.调用A函数是把n的值(并非是n指向的内容,而是指针的值)在函数内开辟空间复制下来。
2.A函数中的n和main中的存储n的内存地址是不一样的,但是都是存储了n的值(n是指针)。
3.A函数任何传递非指针、非引用的参数,都会在A函数的函数栈内开辟空间复制这个值,如果是数组,都会复制该数组在该函数,一旦退出该函数,针对A函数对m的操作都会实现,因为A函数内的m是对A函数参数m的复制,并非原始数据。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:18315次
排名:千里之外
原创:65篇
(2)(3)(5)(3)(4)(3)(2)(5)(46)}

我要回帖

更多关于 艾肯声卡怎么调混响 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信