Golang部份特性的C++对比实现

前端之家收集整理的这篇文章主要介绍了Golang部份特性的C++对比实现前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

今天看到一篇文章<<C++ 逐渐 Python 化>>, 我个人是认为这个说法是不成立的,但这里面的一些特性对比引起了我的兴趣。

我想尝试下,Go语言所带的一些东西,在C++11中是如何做的,应当很有意思。所以刷刷刷,就有了下面的东西。

目录:

字符串字面值
变量初始化
lambda
值顺序递增
多值赋值及函数返回多值
map查找
可变参数
回调函数
泛型
数组和切片


字面值

这个东西在两种语言中都有比较好的解决方式.Go语言用" ` "符号,C++使用R(" )"这种方式。可以省掉不少转义符的输入。

@H_301_50@Golang

@H_301_50@

  1. path:=`c:\a\b\c\GG再也不用烦转义符了`
  2. mulln:=`"(C++/Golang
  3. aa'aaa\Cplusplus/gogogo
  4. author"xiongchuanliang
  5. `
  6. fmt.Println(path)
  7. fmt.Println(mulln)
C++@H_301_50@

@H_301_50@

变量初始化

现在开发语言的初始化都差不多,都能很方便的定义时初始化,循环也是如下面中的C++ for循环和Go语言中的"for : rang"

形式基本一样。 另外C++的auto,Go语言中的":=",都能省代码的好东西。不过要多提一句,Go语言支持多重赋值,并且变量都

是默认就已初始化好。同时,Go语言也支持指针,但它的指针要安全得多。

@H_301_50@Golang

C++

lambda

lambda这东西在C++11中可是重点推荐的特性,非常的强大。Go语言自然也有,但对于匿名函数函数外部变量的处理

并没有C++那么多种。 像C++分了四类:

[a,&b] a变量以值的方式呗捕获,b以引用的方式被捕获。
[this] 以值的方式捕获 this 指针。
[&] 以引用的方式捕获所有的外部自动变量。
[=] 以值的方式捕获所有的外部自动变量。
[] 不捕获外部的任何变量。

而Go语言默认就相当于"[=]",即,捕获可见范围内所有的外部变量。

Golang

C++

值顺序递增(iota)

iota这个小东西很有特点,两种语言都支持且都是让数据顺序递增,从功能上看C++的iota似乎更强大灵活些。 但有意思的是,

似乎在Go语言中,iota的使用频率要高得多,被大量的用于像const定义之类的地方,有意思。

Golang

C++

多值赋值及函数返回多值

这个功能在Go语言中相当方便,C++中则需要使用tuple和 tie等才能实现,有点麻烦,但效果是一样的。

@H_301_50@Golang

C++

map查找

Go语言中map的查找特别方便. 要找个值,直接map[key]就出来了。C++也可以直接用find(key)的方式,但Go语言直接有个

found的变量,能告知是否有找到,这个要比C++去比end(),要直观些,也可以少打些字。

@H_301_50@Golang

可变参数

可变参数是指函数的最后一个参数可以接受任意个参数,我在用Go语言实现的args_demo()例子中,用了效果一样的两种不同

调用方法来展示Go语言对这个下的功夫。然后可以再看看通过C++模板实现的,一个比较有代表性的Print函数来感受感受C++

对这个可变参数的处理方式。

Golang

copy

template<typenameT>voidfmtPrintln(Tvalue){
  • cout<<value<<endl;
  • typenameT,153); background-color:inherit; font-weight:bold">typename...Args>
  • voidfmtPrintln(Thead,Args...args)
  • cout<<head<<"";
  • fmtPrintln(args...);
  • fmtPrintln("fmtPrintln():",0); background-color:inherit">//执行结果:
  • 变长参数
  • fmtPrintln():12C++11Golang
  • 变长参数end.

  • 回调函数

    对比看看两种语言函数的回调处理,实现方法没啥差异。

    @H_301_50@copy

    typefuncTypefunc(string)
  • funcprintFunc(strstring){
  • fmt.Println("callFunc()->printFunc():",str)
  • funccallFunc(argstring,ffuncType){
  • f(arg)
  • callFunc("回调就是你调我,我调它,大家一起玩。",printFunc)

  • C++


    泛型

    C++泛型就不用多说了,都知道有多强大。Go语言要加入这个不知道是啥时候的事,不过通过简单的反射,还

    是可以实现类似的功能,但代码有点长。

    Golang

    copy @H_51_404@
    funccompare(v1,v2interface{})(switchv1.(type){
  • caseint:
  • ifv1.(int)<v2.(return-1,nil
  • elseint)==v2.(return0,153); background-color:inherit; font-weight:bold">caseint8:
  • ifv1.(int8)<v2.(int8){
  • ifv1.(int8)==v2.(int8){
  • caseint32:
  • ifv1.(int32)<v2.(int32){
  • ifv1.(int32)==v2.(int32){
  • //省略......
  • default:
  • return-2,errors.New("未能处理的数据类型.")
  • return1,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; list-style-position:outside!important"> v1:=13
  • v2:=53
  • ret,err:=compare(v1,v2)
  • iferr!=nil{
  • fmt.Println(err)
  • return
  • switchret{
  • case-1:
  • fmt.Println("v1<v2")
  • case0:
  • fmt.Println("v1==v2")
  • case1:
  • fmt.Println("v1>v2")
  • default:
  • fmt.Println("defualt")
  • }
  • C++


    数组和切片(sclie)

    数组/切片Go语言做得非常灵活,不一一举例,这里主要可以看看C++的。我用copy_n,copy_if 模拟二下简单的切片功能

    Golang

    copy

    inta[5]={1,5};
  • intb[3]={0};
  • intc[2]={0};
  • cout<<"a[5]={1,5}"<<endl;
  • cout<<"array[:end_pos]:b=array[:3]"<<endl;
  • //array[:end_pos]
  • copy_n(a,b);
  • intvarinb)
  • cout<<""<<var;
  • cout<<"a[5]={1,5}"<<endl;
  • cout<<"array[begin_pos:end_pos]:c=array[1,2]"<<endl;
  • //array[begin_pos:end_pos]
  • intbegin_pos=1;
  • intsubLen=sizeof(c)/sizeof(c[0]);
  • intend_pos=begin_pos+subLen;
  • copy_if(a+begin_pos,a+end_pos,87); background-color:inherit; font-weight:bold">intv){returntrue;});
  • intvarinc)
  • cout<<""<<var;
  • cout<<endl;
  • //运行结果:
  • 数组和切片(sclie)
  • a[5]={1,5}
  • array[:end_pos]:b=array[:3]
  • 123
  • a[5]={1,5}
  • array[begin_pos:end_pos]:c=array[1,2]
  • 23
  • 数组和切片(sclie)end.

  • 很粗浅的分别实现下这几个点,体会是C++很强大,Golang更纯粹,少即是多。

    Go语言和C++完整测试源码我放在此:点击下载

    可以自行下载编译。

    原文链接:https://www.f2er.com/go/189028.html

    猜你在找的Go相关文章