变量初始化
现在开发语言的初始化都差不多,都能很方便的定义时初始化,循环也是如下面中的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++
copy
intarr[]={1,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; list-style-position:outside!important"> for_each(begin(arr),end(arr),[](intn){cout<<n<<endl;});
autofunc=[](intn){cout<<n<<endl;};
for_each(begin(arr),func);
值顺序递增(iota)
iota这个小东西很有特点,两种语言都支持且都是让数据顺序递增,从功能上看C++的iota似乎更强大灵活些。 但有意思的是,
似乎在Go语言中,iota的使用频率要高得多,被大量的用于像const定义之类的地方,有意思。
Golang
copy
const(
Red=iota
Green
Blue
)
fmt.Println("Red:",Red,"Gree:",Green,"Blue:",Blue);
C++
copy
intd[5]={0};
std::iota(d,d+5,10);
cout<<"iota_demo():old:d[5]={0}"<<endl;
cout<<"iota_demo():iota:d[5]={";
foreach(intvarind)
{
cout<<var<<"";
}
cout<<"}"<<endl;
chare[5]={'a'};
charf[5]={0};
copy_n(e,5,f);
cout<<"iota_demo():old:e[5]={'a'}"<<endl;
cout<<"iota_demo():iota:e[5]"<<endl;
std::iota(e,e+5,'e');
for(size_ti=0;i<5;i++)
{
cout<<"iota="<<e[i]<<endl;
值顺序递增
iota_demo():old:d[5]={0}
iota_demo():iota:d[5]={1011121314}
iota_demo():old:e[5]={'a'}
iota_demo():iota:e[5]
iota=e
iota=f
iota=g
iota=h
iota=i
值顺序递增end.
多值赋值及函数返回多值
这个功能在Go语言中相当方便,C++中则需要使用tuple和 tie等才能实现,有点麻烦,但效果是一样的。
@H_301_50@Golang
copy
functuple_demo()( a,b:=1,2
fmt.Println("a:",a,"b:",b);
c,d:=b,a
fmt.Println("c:",c,"d:",d);
return168,"函数返回的字符串"
}
C++
map查找
Go语言中map的查找特别方便. 要找个值,直接map[key]就出来了。C++也可以直接用find(key)的方式,但Go语言直接有个
found的变量,能告知是否有找到,这个要比C++去比end(),要直观些,也可以少打些字。
@H_301_50@Golang
copy
varmMap=map[string]"b":2,"c":3}
val,found:=mMap["b"]
iffound{
fmt.Println("found:",val);
}else{
fmt.Println("notfound");
copy
typedefmap<string,int>map_str_int;
tuple<string,bool>mapfind_demo(map_str_intmyMap,stringkey){
map_str_int::iteratorpos;
pos=myMap.find(key);
if(pos==myMap.end()){
returnmake_tuple("",false);
returnmake_tuple(pos->first,pos->second,153); background-color:inherit; font-weight:bold">true);
//调用:
automyMap=map_str_int{{"aa",1},{"bb",2},{"cc",3}};
stringmpKey;
intmpValue;
boolmpFound=false;
tie(mpKey,mpValue,mpFound)=mapfind_demo(myMap,"bb");
if(mpFound){
cout<<"mapfind_demo:found"<<endl;
cout<<"mapfind_demo:notfound"<<endl;
}
可变参数
可变参数是指函数的最后一个参数可以接受任意个参数,我在用Go语言实现的args_demo()例子中,用了效果一样的两种不同
调用方法来展示Go语言对这个下的功夫。然后可以再看看通过C++模板实现的,一个比较有代表性的Print函数来感受感受C++
对这个可变参数的处理方式。
Golang
copy
funcargs_demo(firstint){
fmt.Println("ars_demofirst:",first)
for_,i:=rangeargs{
fmt.Println("args:",i)
//调用
args_demo(5,7,8);
int{5,8}
args_demo(mArr[0],mArr[1:]...);
fmt.Println("fmtPrintln():",1,2.0,"C++11","Golang");
执行结果
变量fmtPrintln():12C++11Golang
ars_demofirst:5
args:6
args:7
args:8
args:8
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.