简洁的变量声明和赋值
拿最简单的声明变量和赋值来看,下面这一句完成了声明类型到赋值,最后还有那个常见的分号作为语句的结束。
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
分享到:
相关推荐
golang变量学习 golang变量是golang编程语言中最基本的存储单元,它相当于内存中一个数据存储空间的表示。...golang变量是golang编程语言中最基本的存储单元,掌握golang变量的使用是golang编程的基础。
通过以上知识点的学习,您应该能够掌握Go语言的基本编程技巧,包括编写简单程序、变量声明、流程控制、函数定义、结构体使用以及并发编程等方面的知识。这些技能将为您的后续学习打下坚实的基础。
* Go语言基础知识:变量声明、基本类型、复合类型、函数、结构体、接口、channel等 * Go语言的基本语法:赋值、运算符、控制结构、函数调用等 * Go语言的重要概念:goroutine、channel、 defer、recover等 开发环境...
Go语言的核心要素讲解,例如变量声明方式(var/短变量声明)、常量定义以及不同的控制流程语句(if/else、switch/case、for);数据类型的详细说明,涵盖数字类型(整型、浮点型)、布尔类型、字符串及特殊的数据...
本篇学习文档主要涵盖了GO语言的基础知识,包括环境搭建、命令使用、基本语法、流程控制、函数、面向对象特性以及并发和Web开发的基础。 一、GO语言环境搭建 在开始学习GO语言之前,首先需要配置好环境。GOROOT是GO...
标题:“Go 学习笔记 第四版”表明这是一份以Go语言为学习对象的笔记类文档,根据文件内容来看,该文档会按照基础语法、数据类型、变量、常量等顺序来对Go语言进行介绍。 描述:“Go 语言基础语法、Go 语言数据类型...
2. **变量(Variable)**:Go语言中的变量声明使用`var`关键字,可以使用`:=`简写方式进行初始化。 3. **常量(Constant)**:用`const`关键字声明,一旦定义,其值不能改变。 4. **函数(Function)**:Go语言的...
具体涉及到Hello World程序的编写、变量声明与初始化、数组和切片的操作、映射的使用、条件判断、循环语句、函数声明与调用、匿名函数与闭包、结构体与接口的概念及其应用,最后重点讲解了Go语言独特的并发编程模型...
- **基础概念**:介绍 Go 语言的基本语法,包括变量声明、常量、基本数据类型、运算符、控制结构(如 if、for、switch)等。 - **函数和方法**:讲解如何定义和调用函数,以及在 Go 中的方法定义和面向对象编程的...
4. **程序流程控制**:Go语言的流程控制包括条件语句(if、if-else、switch)和循环语句(for、while)。Go的switch语句尤其强大,它可以匹配多个条件,并且支持类型开关,这在处理接口类型时非常有用。另外,Go语言...
【Golang学习手册】 ...Go语言的学习涵盖了许多方面,从基础语法到高级特性,包括接口、类型系统、错误处理、并发编程等。通过深入学习,你可以掌握Go语言的精髓,利用其强大功能开发高性能的应用程序。
总结 《Go语言教程》是一本全面而深入的Go语言学习指南,旨在帮助读者从零...Go语言基本语法:包括代码组织方式(包、函数、变量声明等)、注释、标识符命名规则等。 数据类型与变量:详细讲解Go语言中的基本数据类型
### Go语言学习之认识Golang #### 一、引言 Go语言,也称为Golang,是由Google设计的一种静态类型的编程语言。它以其简洁的语法、高效的并发模型以及丰富的标准库而闻名。本文将从Go语言的基础入手,通过具体代码...
Go语言,又称Golang,是由Google开发的一种静态类型的、编译型的、并发型的、垃圾回收的语言。它旨在提高编程效率,简化并发编程,并强调简洁的编程哲学。Go语言的设计受到了多门经典编程语言的影响,如C语言、...
在编程基础知识方面,Go 语言的语法入门知识包括变量、常量、数据类型、条件语句、循环语句、函数等。变量的声明需要使用 var 关键字,其格式为 var name type。例如,声明一个名为 age 的整数变量,可以写作 var ...
在Go语言(Golang)中,流程控制语句是程序执行流程的重要组成部分,主要包括if-else分支和for循环。下面我们将详细讲解这两个概念。 1. if-else分支 在Go语言中,`if`语句用于基于一个条件执行代码块。如果条件为...
1. Go语言的基础语法:包括变量声明、类型声明、控制结构(如if-else、switch、for循环)、函数定义等。 2. Go语言的数据类型:讲解Go语言中的基础数据类型(如int、float、bool、string等),以及如何声明和使用...
学习和熟练掌握这些条件语句是成为Go语言开发者的基础,它们是编写复杂逻辑和控制流程的关键工具。通过灵活运用这些语句,你可以构建出高效且易于维护的Go程序。在实际编程中,应根据具体情况选择合适的条件判断方式...
《雨痕golang学习笔记第四版 加上书签版》是针对Go语言学习者的参考资料,作者雨痕在书中详细记录了从2012年开始学习Go语言至今的经验与成果。本书内容全面,涵盖了Go语言的基础知识、数据结构、函数特性、并发编程...
Go语言学习笔记的知识点涵盖广泛,它从基础的语法到高级的并发编程,再到源码的剖析,全面介绍了Go语言的特点和编程技巧。以下是根据所提供的文件内容提取的知识点: 1. Go语言基础:Go是一种静态类型编程语言,...