尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Go语言的简洁

Go语言的简洁 Go语言的创作与C语言有很大的关系。比如它的首席作者就是肯-汤普逊Ken Thompson他与丹尼斯-里奇一道研发了Unix系统后又协助丹尼斯-里奇创作了C语言。他参与Go语言的设计就避免不了受C语言的影响。不过今天我想和大家逐条分享我感受到的Go语言的简洁之处。定义变量var 变量名 类型varaint32定义并赋值让类型自动推断vara100使用”:“语法还可以更精简a:100”:“语法的规则”:“左侧的所有变量中至少有一个变量在该代码段中是第一次出现的如varnum1,num2100,200num1,num2,num3:500,600,700注意”:“不能用于常量定义常量定义const 常量名 类型constaint32100或通过赋值自动推断类型consta100枚举const (枚举值1枚举值2枚举值3…)const(login0logout1exit2loading3fetch4)这里每个枚举值的赋值都不能省略否则它们的值都是一样的这样毫无意义。这一点比其他高级语言来说有点差别的都不需要这样做C语言默认就是从0开始后而就依次叠加。Go语言提供了iota来代替这个赋值。const(loginiotalogout exit loading fetch)iota是从0开始并且自动增长。iota是在作用域结束后增长的。举个例子const(loginiotalogout exitiota1loadingiota3)login 0logout 1exit 3loading6分支与循环语句if 条件1 {// 逻辑1} else if 条件2 {// 逻辑2} else {// 逻辑3}这里的简洁体现在if条件上因为Go的作者们认为if后肯定是一个条件的表达式所以小括号没有什么特别用即使用写了在运行时也会在编译前删除掉。循环只有一个for它做完了所有do whilewhilefor等在C语言里的循环方式。在C语言中的for循环方式在Go里这样被表达的fori:1;i5;i{println(i)}在C语言中的do while循环方式在Go里这样被表达的:j:0for{println(j)jifj5{break}}在C语言中的while循环方式在Go里这样被表达的j:0forj5{println(j)j}函数func 函数名(参数列表) 返回值类型列表 {// 函数体}Go函数可以有0到多个返回值。funcsum(aint32,bint32)int32{returnab}为了简洁如果邻近的参数类型相同可以用一个类型修饰多个参数funcsum(a,bint32)int32{returnab}在这里顺便引入一下指针在Go语言里的指针不像C语言里的指针在Go语言里指针只有间接引用的作用。举个交换两个变量的值的例子funcmain(){a,b:1,2swap(a,b)println(a,b)}funcswap(a,bint){tmp:a ab btmp}a,b的值在swap里被交换了 但是结果没有影响main函数里的ab因为swap是使用值传递的方式把ab的值传递过来。如果是传递引用就可以解决这个问题这个时候指针就派上用场了funcmain(){a,b:1,2swap(a,b)println(a,b)}funcswap(a,b*int){tmp:*a*a*b*btmp}因为Go函数可以返回多个值因此还可以利用此特性来交换两个变量的值funcmain(){a,b:1,2n,m:swap(a,b)println(n,m)}funcswap(a,bint)(int,int){returnb,a}不具名的函数就是函数闭包funcmain(){a,b:1,2n,m:func(num1,num2int)(int,int){returnnum2,num1}(a,b)println(n,m)}在闭包里可以读取父函数的变量funcmain(){f:parent()println(f())println(f())println(f())}funcparent()func()int{i:0returnfunc()int{ireturni}}parent()函数返回一个闭包匿名函数它里面引用了父函数的变量i。运行上面的代码你会发现i在自增一直没有被释放。i变量是不会被释放的因为它被闭包一直引用着所以当parent()函数调用完后i没有被释放。在Go语言里函数是第一等公民可以当作参数传递funcmain(){a,b:1,2addOrSub(a,b,add)println(addOrSub(a,b,add))println(addOrSub(a,b,sub))}funcadd(a,bint)int{returnab}funcsub(a,bint)int{returna-b}funcaddOrSub(a,bint,ffunc(int,int)int)int{returnf(a,b)}Map的遍历其实我个人挺不喜欢Java的map遍历的而Go语言的Map遍历真的很简洁同时构建Map却有些麻烦它必须通过make函数来构建mmap:make(map[string]string)mmap[China]BeiJingmmap[France]Parismmap[US]Washington.D.Cfork,v:rangemmap{fmt.Println(k,v)}使用range关键字来遍历Map。
返回列表