GO语言搭建

最近对GO语言产生了浓厚的兴趣。因为GO语言不仅仅可以开发桌面、web程序,最吸引我的是安卓大有往GO语言全方位靠拢的趋势,自家的系统还是用自家的语言开发比较靠谱。

用一句话来说:Go语言是谷歌2009发布的第二款开源编程语言。 安卓也是谷歌的,这货要闹哪样。

官方一点的解释:Go语言是谷歌推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:“我们之所以开发Go,是因为过去10多年间软件开发的难度令人沮丧。”

好吧说正事。

搭建GO语言开发环境参考这里

Go语言环境搭建方法(Windows)

有兴趣的同学一起学习吧。

QQ群:230931403

以下内容来自AllenDang<我为什么喜欢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{}这个接口。有了这个概念,即使没有泛型也能有效的降低设计复杂度。

多线程还能更简单点吗?

要写多线程,你要懂Thread,懂各种锁,懂各种信号量。在各类系统里面,“异步”逻辑通常代表“困难”。这是Go最强劲的部分,你见过比下面这个还简单的异步代码吗(以下代码摘自Go的官方范例)?

func IsReady(what string, minutes int64) {        time.Sleep(minutes * 60*1e9);        fmt.Println(what, "is ready")    }    go IsReady("tea", 6);    go IsReady("coffee", 2);    fmt.Println("I‘m waiting....");

执行的结果是,打印:    I‘m waiting.... (right away)    coffee is ready (2 min later)    tea is ready (6 min later)

Go语言内置了“go”这个语法,任何go的方法,都将会被异步执行。那异步方法之前传递消息呢?用channel呗。意如其名,就是一个管道,一个往里写,另外一个等着读。

ch := make(chan int) //创建一个只能传递整型的管道

func pump(ch chan int) {        for i := 0; ; i++ { ch <- i } //往管道里写值    }

func suck(ch chan int) {        for { fmt.Println(<-ch) } //这里会等着直到有值从管道里面出来    }

go pump(ch) //异步执行pump

go suck(ch) //异步执行suck

时间: 2024-11-13 09:31:29

GO语言搭建的相关文章

Python 语言搭建SELENIUM测试环境,搭建过程记录。

第一步,安装Python: 第二步,安装SetupTools: 第三步,安装Pip: 第四步,安装selenium(for python) 第五步,新建第一个基于Firefox的测试用例 上述 只是步骤,具体内容,明天补充,睡觉 咯--- Python 语言搭建SELENIUM测试环境,搭建过程记录.

网络采集软件核心技术剖析系列(7)---如何使用C#语言搭建程序框架(经典Winform界面,顶部菜单栏,工具栏,左边树形列表,右边多Tab界面)

一 本系列随笔概览及产生的背景 自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受广大博客写作和阅读爱好者的喜爱.同时也不乏一些技术爱好者咨询我,这个软件里面各种实用的功能是如何实现的. 该软件使用.NET技术开发,为回馈社区,现将该软件中用到的核心技术,开辟一个专栏,写一个系列文章,以飨广大技术爱好者. 本系列文章除了讲解网络采编发用到的各种重要技术之外,也提供了不少问题的解决思路和界面开发的编程经验,非常适合.NET开发的初级,中级读者,希望大家多多支持. 很多初学者常有此类困惑,“为

JAVA语言搭建白盒静态代码、黑盒网站插件式自动化安全审计平台

近期打算做一个插件化的白盒静态代码安全审计自动化平台和黑盒网站安全审计自动化平台.现在开源或半开源做黑盒网站安全扫描的平台,大多是基于python脚本,安全人员贡献python脚本插件增强平台功能.对自己或身边开发人员,对java语言更熟悉,为了后期维护打算采用java写一个这样的平台.另外白盒代码安全扫描也有Fortify等收费软件,或依赖PMD做代码分析,不过比如新增了什么安全问题,需要自定义或扩展就比较麻烦. 比如一个简单的:现在用struts2存在漏洞,现在需要升级到2.3.28版本,于

七牛C#语言搭建javascript上传--包含后端请求token(前端javascript+后端c#)

Qiniu 七牛问题解答 很多用户反应不会自己搭建javascript的工程,因为涉及到请求服务端的token,在我的博客中包含了(javascript前端+后端java)的工程demao. 问题解决方案 点击这里写在完整的工程 1,首先你要打开你的vs,建一个asp.net的web项目.然后在你的网站建一个asp的web页面,拷贝以下代码进去: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind=

搭建SVN服务器详细教程

搭建SVN服务器详细教程 本教程会从最基本的下载安装到上传代码,下载代码这条线来详细讲述如何完成SVN服务器的搭建 下载并安装VisualSVN server 下载并安装TortoiseSVN 导入项目 创建用户组和用户 设置权限 检出项目 下载并安装VisualSVN server 下载VisualSVN server 下载地址:https://www.visualsvn.com/server/download/ 下载完成后是这样的 安装VisualSVN server` Location是指

python &amp; go 语言完成最简单的web应用

徒手使用python和go语言搭建最简单的web页面-使用模板,无持久化 也许我们会接触到很多语言的web应用,譬如php,java,包括今天介绍的python和go,实际上我们在使用这些语言构建web应用的时候,很多时候变成了单纯的调用包和api,而忽略底层的原理.不过呢,所有的web应用,模型都是一致的.浏览器发送一个http请求:服务器收到请求,生成一个html页面,作为body返回给客户端:客户端解析对应的html页面. 搞清楚这个简单的逻辑,我们就可以轻而易举开发web应用了. 先说p

豆瓣的开发语言:无所不能的python

? ????面对珍珠(Perl)夺目之光.灵蛇(Python)更具有上天入地之能.它可以在 MS-DOS,Amiga,BeOS, OS/2,VMS,QNX等多种OS上运行:比 Perl 和 VB更快更好,比 C 和 C++ 语言更具扩充性:不仅在"星球大战". "星球之旅(Star Trek)"等超级大片中当纲特技和动画制作,还闯入了美国航天航空局控制室.真相如何,请看报道.? 对 Perl (珍珠) 语言,互联网开发人员可以说是无人不知.无人不晓:它运行迅捷.操作

脚步语言的评估

混合语言是一种知识密集型的编程.我们必须具备能判断这些语言在什么地方最合适.虽然C语言的工作效率高和接近机器语言.但开发速度成本高,而相对脚步语言,则更容易解决实际问题.以下就我工作中会用到的脚步语言. Shell Shell 有多种变种,目前大多数Linux默认的shell是bash.简单shell程序的编写及其容易和自然.Unix使用解释语言搭建原型系统.shell 的最佳之处在于书写小型脚本非常自然快捷.最糟糕之处在于大型shell脚本必须依靠大量的辅助命令,而这些辅助命令不一定在所有目标

网络采集软件核心技术剖析系列(2)---如何使用C#语言获得任意站点博文的正文及标题

一 本系列随笔概览及产生的背景 本系列开篇受到大家的热烈欢迎,这对博主是莫大的鼓励,此为本系列第二篇,希望大家继续支持,为我继续写作提供动力. 自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受广大博客写作和阅读爱好者的喜爱.同时也不乏一些技术爱好者咨询我,这个软件里面各种实用的功能是如何实现的. 该软件使用.NET技术开发,为回馈社区,现将该软件中用到的核心技术,开辟一个专栏,写一个系列文章,以飨广大技术爱好者. 本系列文章除了讲解网络采编发用到的各种重要技术之外,也提供了不少问题的解决