`
balsampears
  • 浏览: 48499 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

[转]Go基础学习: 控制语句,变量声明等

阅读更多
简洁的变量声明和赋值
拿最简单的声明变量和赋值来看,下面这一句完成了声明类型到赋值,最后还有那个常见的分号作为语句的结束。
var i int = 10;

这个一点都不简洁对吧?为什么非要有“var”?为什么不能自己推导变量类型?为什么结尾非要加上分号?这三个问题,我相信Go语言的设计者也问过,并且都针对性的给了改进。重新来过。
i := 10

怎么样?“:=”是声明并推导类型的语法糖,结尾的分号也省了,因为这里我换行了,编译器明白的。
还可以一次性声明并赋值多个变量。
i, j, k := 1, 2, 3

不同的类型也可以。
i, j, k := 1, 1.0, "hello"

如果要声明一堆变量,但暂时不赋值呢?可以这样。
var (
    i, j int
    s string
    u, v, s = 2.0, 3.0, "bar"
)

Go的设计者甚至觉得多打几个“var”都不应该!

简洁的if
有点意思了对吧?我学习一门新语言的时候,第一眼看变量类型和声明,第二眼就会去看逻辑控制的语法。现在来看看都有些什么?
if i > 10 {
    println(“Greater then 10”)
}

稀松平常啊,难道一个简单的if还能更简单?恩,的确是的。首先if后面的条件判断没有人逼你再加上括号了,仅仅是少了两次按键嘛,还有呢?还有!下面这个应该是很常见的if使用场景。
result := SomeMethod()
if result > 0 {
}

很多时候result这个变量其实仅仅用于条件判断,完全可以在if之后就扔掉,所以Go有了这么个写法。
if result := SomeMethod(); result > 0 {
    //
}

这个表达式太常用了,真是谁写谁知道,每次我写着一行都会心里一爽。来看看纠结一点的if段。
if a {
} else if b {
} else if c {
} else {
}

这种写法是可以的,但不是Go推荐的,理由是可以更简洁。比如强悍的switch。

强悍的switch
这是很大家熟知的switch用法,注意,没有break哦!Go里面case之间不会“下穿”。
switch tag {
    default: 
        s3()
    case 0, 1, 2, 3:
        s1()
    case 4, 5, 6, 7: 
        s2()
}

神奇一点的switch,嘿嘿,与if异曲同工之妙。
switch x := f(); {  // missing switch expression means "true"
    case x < 0: return -x
    default: return x
}

还有这个,有了这个更加明确的写法,你真的还会if…else if…else if…else…吗?
switch {
    case x < y: f1()
    case x < z: f2()
    case x == 4: f3()
}

条件判断舒服了,循环呢?

孤单的for
其实我一直不太明白,为什么一门语言里面要提供多个循环语法呢?for、while、do…while…都是不可替代的?用哪一个呢?似乎都是看个人爱好吧?可能大家随便就可以举个例子出来证明这三个东西存在的必要和细微的差别,但对于我来说,做同一件事情如果有多种方法其实就是设计上的冗余,会对使用者造成或多或少的困扰。来看看Go的循环吧。
for i := 0; i < 10; i++ {
}
for a < b {
}
for {
}

看吧,一个for就搞定所有情况了。来看一个常用的遍历集合,一把来说会写成这样。
count := len(someArray)
for i := 0; i < count; i++ {
    println(someArray[i])
}

简化这个,Go给出了一个关键字“range”,先看用法。
for i, value := range someArray {
    // i 是整型,代表下标
    // value就是数组内值的类型
}

range不单单可以用于数组,实际上它可以用于任何集合,比如map。
m := map[string]int{"mon":0, "tue":1, "wed":2, "thu":3, "fri":4, "sat":5, "sun":6}
for i, s := range a {
    // type of i is int
    // type of s is string
}

这里只是提到了几点最基本的语法场景,Go里面还有很多!

函数可以返回多个值
其实能够在一行多重赋值的语言挺多的,但一个函数能返回多个值的就很少了,比如在C#里面如果要返回两个int,通常会这么干。
public class TwoInts
{
    public int A;
    public int B;
}
public class Foo
{
    public TwoInts ReturnTwoInt();
}
然后就可以 TwoInts ti = foo.CalcTwoInt() 觉得悲催吗?也许你都麻木了对吗?很多语言都是这么设计的。函数只能返回一个值最大的问题是会导致出现很多没必要的数据结构。上面就体现了这个冗余,当然,你说可以用out关键字让函数返回,但这个语法用起来就不是那么安全了。而这个问题在Go里面解决起来太容易了,因为Go的函数可以返回多个值!
func returnTwoInt() (int, int) {
}
a, b := returnTwoInt()

我对Go的好感就是从这里萌芽的,这让我的库里面从此少了很多数据结构!这无形中就能降低设计的复杂度。

函数内部声明的对象指针可以安全的返回
func ReturnPointer() *Object1 {
    obj := new Object1()
    obj.A = “hello”
    return obj
}

Go的垃圾回收器会处理好这种情况的,放心啦!

异常处理?defer是啥?能吃吗?
为什么异常处理那么复杂?多少人可以安全的实现下面这个逻辑?以下是伪代码。
File f = File.Read(“c:\\text.txt”)
f.Write(xxx)
f.Close()

我相信,有经验的码农们脑子里面瞬间出现了各种版本的try…catch…finally…,还有各种各样的书写规范,比如“catch”里面的逻辑不能在抛异常之类的东西。其实想想,我们的要求很简单,打开一个文件,然后保证它在最后被关闭。仅此而已,为什么做这么简单的一件事情非要那么复杂?看看人家Go是怎么做的!
func SaveSomething() {
    if f, err := os.Open(“c:\\text.txt”); err == nil {
        //各种读写
        defer f.Close()
    }
}

凡是加了defer的函数,都会在当前函数(这里就是SaveSomething)执行完毕之后执行。就算“//各种读写”时发生异常f.Close也会坚定的在SaveSomething退出时被执行。有了这个,释放点资源,关闭个把句柄这种小事再也无足挂齿!

接口再也不用“实现”了
从我接触OO思想一来,凡是有接口的语言,都以不同的方式要求类“实现”接口,这样的方式我一直都认为是天经地义的,直到我遇见了Go。
type Speaker interface {
    Say()
}

上面定义了一个接口,只有一个方法,Say,不需要参数,也没有返回值。Go里面,任何拥有某个接口所定义所有方法的东西,都默认实现了该接口。这是一句拥有太多内涵的话,足矣对设计思路产生重大的影响。比如下面这个方法,它接受一个类型为Speaker的参数。
func SaySomething(s Speaker) {
    s.Say()
}

那么所有拥有Say()方法的东西都可以往里扔。
在Go的世界里,所有的东西都默认实现了interface{}这个接口。有了这个概念,即使没有泛型也能有效的降低设计复杂度。

转自:http://www.cnblogs.com/AllenDang/archive/2012/03/03/2378534.html
分享到:
评论

相关推荐

    Go语言基础入门教程,并介绍了Go语言编写简单的程序、声明变量、使用流程控制语句、定义函数、使用结构体和方法、进行并发编程等技能

    Go语言是一种由Google开发的开源编程语言,它的设计目标是提供一种...通过学习本教程,你应该已经掌握了如何使用Go语言编写简单的程序、声明变量、使用流程控制语句、定义函数、使用结构体和方法、进行并发编程等技能。

    Go语言入门指南大纲及框架建议:轻松掌握Go语言学习秘诀.docx

    Go语言入门指南大纲及框架建议:轻松掌握Go语言学习秘诀 1. Go语言概述  Go语言的历史和创造者  Go语言的主要特性和优势  Go语言的应用领域 2. 安装与配置  在不同操作系统(Windows, macOS, Linux)上安装...

    Go编程1-变量声明

    Go语言的变量声明方式与C和C++语言有明显不同。对于变量声明,Go语言引入了关键字var,而类型信息放在变量名之后,示例如下: Var v1 int Var v2 string Var v3 [10] int //数组 Var v4 [] int //数组切片 Var v5 ...

    Golang学习笔记(三):控制流

    在判断语句里卖弄允许声明一个变量,其作用域只在逻辑块内,其他地方不起作用 花括号一定存在,且必须与if/else在同一行 2.语法 代码如下: //基本 if a &gt; 0 { //无括号  dosomething() } else if a == 0 {

    go语言if/else语句简单用法示例

    本文实例讲述了go语言if/else语句用法。分享给大家供大家参考,具体如下: if else分支在go语言里是简单明了的。 这里有个简单的例子。 if语句可以没有else。 可以在条件语句前添加别的语句。这个语句中声明的变量的...

    3.Golang的基础语法(变量,常量)1

    声明常量可以使常量成器iota初始化,于成组以相似规则初始化的常量,不每都写遍初始化表达式在个const声明语句中,在第1个声明的常量的所在,iota会被置为0

    107个常用javascript语句

    13.JS中声明变量使用:var来进行声明 14.JS中的判断语句结构:if(condition){}else{} 15.JS中的循环结构:for([initial expression];[condition];[upadte expression]) {inside loop} 16.循环中止的命令是:break 17.JS...

    Go流程控制1:if-else

    1.if 1.1基本语法 package main import fmt ...我们可以在if语句内声明变量,这个变量的作用域也仅在这个if流程内,除了这个if,声明的变量就失效了。 1.2支持一个初始化 package main import fmt func

    通过测试学习:通过测试驱动的开发来学习Go

    -声明变量,常量,if / else语句,切换,编写您的第一个go程序并编写第一个测试。 子测试语法和闭包。 -进一步探索函数声明语法,并学习改进代码文档的新方法。 -了解for和标杆。 -了解数组,切片, len ,var...

    go开发实战.doc

    2.2.1 变量声明 5 2.2.2 变量初始化 6 2.2.3 变量赋值 6 2.2.4 匿名变量 6 2.3 常量 7 2.3.1 字面常量(常量值) 7 2.3.2 常量定义 8 2.3.3 iota枚举 8 2.4 基础数据类型 10 2.4.1 分类 10 2.4.2 布尔类型 ...

    Go语言基础知识总结(语法、变量、数值类型、表达式、控制结构等)

    golang源码采用UTF-8编码。空格包括:空白,tab,换行,回车。 – 标识符由字母和数字组成(外加’_’),字母和数字都是Unicode编码。 – 注释: 代码如下: /* This is a comment; no nesting */ // So is this. ...

    Golang2-new.docx

    个人学习golang笔记,从各种教程中总结而来,作为入门参考。目录如下 目录 1. 入门 1 1.1. Hello world 1 1.2. 命令行参数 2 2. 程序结构 3 2.1. 类型 4 2.1.1. 命名类型(named type)与未命名类型(unamed ...

    SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别.doc

    注意:在执行拼接SQL 语句的时候,的EXEC括号中只允许包含一个字符串变量,但是可以串联多个变量,如果我们直接执行这个SQL语句: --这是错误的调用 EXEC &#40;'SELECT * FROM '+QUOTENAME(@TableName&#41; +'WHERE...

    Go 语言结构

    在我们开始学习 Go 编程语言的基础构建模块前,让我们先来了解 Go 语言最简单程序的结构。 Go Hello World 实例 Go 语言的基础组成有以下几个部分: 包声明 引入包 函数 变量 语句 & 表达式 注释 接下来让我们来看...

    C#本质论(第3版)

    1.6 托管执行和公共语言基础结构 1.7 c#和net版本 .1.8 cil和ildasm 1.9 小结 第2章 数据类型 2.1 基本数值类型 2.1.1 整数类型 2.1.2 浮点类型 2.1.3 decimal类型 2.1.4 字面值 2.2 更多基本类型 ...

    JavaScript笔记

    |--undefined:表示声明了变量但从未赋值或者对象属性不存在 10.双等号(==)和全等号(===): |--“==”为确定两个运算数是否相等,“==”运算符会进行类型转换。转换后运算数相等就返回true,否则返回false |...

    godebug:已弃用! https

    运行godebug ,它将解析程序,分析函数调用,变量声明和语句行,将结果代码输出到某个地方,然后运行/编译它。 运行此修改后的代码后,它会在断点处停止,并让您单步执行程序并检查变量。 有关更多详细信息,请...

    TIL:让我们与Markdown一起组织今天的课程!!

    高朗Go语言的特点和安装方法让我们用Go语言制作Hello World Go语言中的变量和常量声明Go中的运算符Go中的运算符2 Go语言中数据类型的类型,特征和转换对于Go语言中的声明Go语言中的if-else语句使用Go语言打印和扫描...

    JavaScript基础和实例代码

    2.8.3 switch流程控制语句 2.8.4 for循环语句 2.8.5 while和do-while循环语句 2.8.6 使用break和continue进行循坏控制 2.8.7 with对象操作语句 2.8.8 使用for…in进行对象循坏 2.8.9 含标签的语句 2.9 函数 2.9.1 ...

    PHP基础教程 是一个比较有价值的PHP新手教程!

    所有变量都是局部变量,为了使得定义的函数中可以使用外部变量,使用global语句。而你要将该变量的作用范围限制在该函数之内,使用static语句。 $g_var = 1 ; // 全局范围 function test() { global $g_var; // 这样...

Global site tag (gtag.js) - Google Analytics