Go语言入门之——基本了解

栏目: Go · 发布时间: 5年前

内容简介:2007年,受够了C++煎熬的Google首席软件工程师Rob Pike纠集Robert Griesemer和Ken Thompson两位牛人,决定创造一种新语言来取代C++, 这就是Golang。出现在21世纪的GO语言,虽然不能如愿对C++取而代之,但是其近C的执行性能和近解析型语言的开发效率以及近乎于完美的编译速度,已经风靡全球。特别是在云项目中,大部分都使用了Golang来开发,不得不说,Golang早已深入人心。而对于一个没有历史负担的新项目,Golang或许就是个不二的选择。被称为GO语言之父的

Go语言基础

一、简介

(1)什么是 go 语言?

2007年,受够了C++煎熬的Google首席软件工程师Rob Pike纠集Robert Griesemer和Ken Thompson两位牛人,决定创造一种新语言来取代C++, 这就是Golang。出现在21世纪的GO语言,虽然不能如愿对C++取而代之,但是其近C的执行性能和近解析型语言的开发效率以及近乎于完美的编译速度,已经风靡全球。特别是在云项目中,大部分都使用了Golang来开发,不得不说,Golang早已深入人心。而对于一个没有历史负担的新项目,Golang或许就是个不二的选择。

被称为GO语言之父的Rob Pike说,你是否同意GO语言,取决于你是认可少就是多,还是少就是少(Less is more or less is less)。Rob Pike以一种非常朴素的方式,概括了GO语言的整个设计哲学–将简单、实用体现得淋漓尽致。

很多人将GO语言称为21世纪的C语言,因为GO不仅拥有C的简洁和性能,而且还很好的提供了21世纪互联网环境下服务端开发的各种实用特性,让开发者在语言级别就可以方便的得到自己想要的东西。

  • 1.1、发展历史

    2007年9月,Rob Pike在Google分布式编译平台上进行C++编译,在漫长的等待过程中,他和Robert Griesemer探讨了程序设计语言的一些关键性问题,他们认为,简化编程语言相比于在臃肿的语言上不断增加新特性,会是更大的进步。随后他们在编译结束之前说服了身边的Ken Thompson,觉得有必要为此做一些事情。几天后,他们发起了一个叫Golang的项目,将它作为自由时间的实验项目。

2008年5月 Google发现了GO语言的巨大潜力,得到了Google的全力支持,这些人开始全职投入GO语言的设计和开发。

2009年11月 GO语言第一个版本发布。2012年3月 第一个正式版本Go1.0发布。

2015年8月 go1.5发布,这个版本被认为是历史性的。完全移除 C语言 部分,使用GO编译GO,少量代码使用汇编实现。另外,他们请来了内存管理方面的权威专家Rick Hudson,对GC进行了重新设计,支持并发GC,解决了一直以来广为诟病的GC时延(STW)问题。并且在此后的版本中,又对GC做了更进一步的优化。到go1.8时,相同业务场景下的GC时延已经可以从go1.1的数秒,控制在1ms以内。GC问题的解决,可以说GO语言在服务端开发方面,几乎抹平了所有的弱点。

在GO语言的版本迭代过程中,语言特性基本上没有太大的变化,基本上维持在GO1.1的基准上,并且官方承诺,新版本对老版本下开发的代码完全兼容。事实上,GO开发团队在新增语言特性上显得非常谨慎,而在稳定性、编译速度、执行效率以及GC性能等方面进行了持续不断的优化。

(2)golang语言特性

  • 2.1. 垃圾回收

    • 内存自动回收,再也不需要开发人员管理内存
    • 开发人员专注业务实现,降低了心智负担
    • 只需要new分配内存,不需要释放
  • 2.2. goroute天然并发

    • 从语言层面支持并发,非常简单

    使用一个 go 则在编译时会自动开启一个线程来执行后面的命令/函数/方法,不用像 python 需要先调用thread模块来开启线程

    • goroute,轻量级线程,创建成千上万个goroute成为可能
    • 基于CSP(Communicating Sequential Process)模型实现
  • 2.3. goroute线程之间的数据通信——管道

    使用go可以创建一个轻量级的goroute线程,线程之间如何通信,共享数据呢?答案是:使用管道来进行通信。管道需要定义并创建后,才能使用

    定义一个管道:

    var my_pipe chan int
    //my_pipe为管道名,chan为管道关键字表示定义的是一个管道,int表示管道内存储的数据类型

    创建一个管道:

    my_pipe = make(chan int,10)
    //make关键字表示开辟一个内存空间,第一个参数表示创建一个管道,10表示管道能存储的数据类型个数,如果超出则阻塞

    定义和创建可以合并写

    my_pipe := make(chan int,10)

    管道的定义和使用范例:

    //goroute线程之间使用管道进行数据通信
    
    func main() {
    go pi_pie()
    }
    
    func pi_pie() {
      pipe := make(chan int, 10) //make关键字创建一个管道(关键字chan),管道内装int类型的数据,并且管道大小能装10个数字,超过则阻塞
      pipe <- 10                 //向管道内放入数据
      pipe <- 9
      pipe <- 9
      pipe <- 7
      pipe <- 6
      var p1 int
      p1 = <-pipe //从管道取出数据
      fmt.Println(p1)
      fmt.Println(len(pipe))
    }
  • 2.4. 多返回值

    go的函数可以有多个返回值

    “`
    func main() {
    x,y:=p_fun(10,80)
    // x,_ := p_fun(10,80) 多返回值函数时,只要一个返回值
    fmt.Println(x,y)
    }

    //多返回值函数
    func p_fun(a int,b int) (int,int) { //函数传入2个整型参数,返回2个值,都为int类型
    sum := a+b
    avg := (a+b)/2
    return sum,avg
    }

  • 2.5. go的“包”的概念

    • 1.和python一样,把相同功能的代码放到一个目录,称之为包
    • 2.包可以被其他包引用
    • 3.main包是用来生成可执行文件,每个程序只有一个main包
    • 4.包的主要用途是提高代码的可复用性
    • 5.包的引用

    go在首行使用“ package <包名> ”来声明自己所在的包(主程序包为main包,也可以自定义包名),“import”引入其他的包,go自带的系统包所在的路径已经在“GOROOT”环境变量中设置好了
    可以使用“import”直接引入,而自己定义的包: package <包名> 在import导入时则需要相对路径: 第三方包默认在“GOROOT”和“GOPATH”环境变量所在的路径下的src目录下寻找

    Go语言入门之——基本了解
    Go语言入门之——基本了解

    Go的package不支持使用“../”方式的相对路径,都是从$GOPATH/src下一层一层找的

  • 2.6. go文件编码规范

    使用 gofmt <go文件> 使go文件内的代码更规范(缩进等格式更规范),使用 gofmt -w <go文件> 将原来的go文件修改的更规范

二、环境搭建

环境搭建参考网址: https://blog.csdn.net/fearless11/article/details/70543932

(1)开发环境搭建

  • 1.1 安装Go环境

    • 打开网址 https://golang.org/dl/
    • 根据操作系统选择对应的安装包
    • 点击安装包进行安装(linux直接解压)
    • 设置环境变量(linux)

      1. export GOROOT=$PATH:/path/to/go/ #go的家目录

      2. export PATH= P A T H :

        GOROOT/bin/ #go执行命令路径
      3. export GOPATH=/home/user/project/go #项目路径

    • 设置环境变量(window)

    参考: https://blog.csdn.net/fearless11/article/details/70543932

  • 1.2 开发环境搭建(IDE为VScode)

    • 打开网址: https://code.visualstudio.com/
    • 根据操作系统选择对应的安装包
    • 根据操作系统选择对应的安装包
    • 根据操作系统选择对应的安装包
    • 调试工具delve安装

      1. mac: brew install go-delve/delve/delve

      2. linux&windows: go get -u github.com/derekparker/delve/cmd/dlv #请确保已经安装了git

    • 注意事项: VScode开发的项目路径与环境变量 ==“GOPATH”== 的路径要一致,如 $GOPATH = d:\go_build 那么VScode开发的项目也要在d:\go_build目录下
  • 1.3 开发环境搭建(IDE为pycharm)

    '''新版本的pycharm可能已经无法使用'''
    
    pycharm的go语言开发支持插件下载:
    
    1.在pycharm中通过在线搜索go插件来安装
    
    2.可能因为版本原因,pycharm的在线插件安装可能搜索不到,可以采用本地安装的方法:
    
    插件本地安装包下载页面:
    
    https://plugins.jetbrains.com/plugin/5047-go-language-golang-org-support-plugin (pycharm社区版)
    https://plugins.jetbrains.com/plugin/9568-go (pycharm专业版)
    
    根据pycharm的idea版本号(idea版本号在安装目录下的“build.txt/readme.txt”文件中,通常是AA.BBBB.CC的形式)来选择下载插件的版本
    
    > 需要注意的是,pycharm的idea号AA.BBBB.CC 只要 AA与网站上的idea号对应上即可,它是一个范围,如idea号172.4343.24就可以下载范围“172.3968-172.*”对应的插件版本

(2)编译环境和编译流程

  • 2.1 编译需要的目录环境

    我们的go项目的开发根目录由 GOPATH 环境变量决定了(范例为:d:/go_build),当我们需要开发项目工程时,需要在根目录下先创建src目录(规定死了),
    然后在 src 目录下创建开发的项目名称,如项目名称为app_store, 那么你的go文件应该在 d:/go_build/src/app_store 目录下进行开发

    当使用, go get github.com/golang/tools 相关命令来安装go的开发插件时,默认下载到 G O P A T H / s r c / ==

    GOPATH/src/github.com/golang/tools/…,然后再将
    该目录下的go文件编译成可执行的二进制文件,放入 $GOPATH/bin 目录下,来使用

    go get <github等网址>.... ,即在指定网址下载go文件,到 G O P A T H / s r c /

    GOPATH/bin 目录下,之后可以在IDE开发中直接使用(如调试台)
  • 2.2 编译go文件为二进制可执行代码

    使用 go build <go文件所在目录> 命令,来进行go文件编译

    例如: ==GOPATH==为 d:/go_build时,编译 d:/go_build/src/app_store/app.go 文件时,编译的命令为 : go build app_store/app.go 则会在当前目录生成app.exe执行文件(Windows)

    go build时,默认会从$GOPATH/src/ 目录下开始寻找目录,因此只需要相对地址即可

    编译go文件为可执行文件并将文件放到指定位置下

    go build -o %GOPATH%/bin/calcs.exe app_store/app.go
    //将go文件编译到GOPATH变量所在目录下的bin目录里面,名称为calcs,后缀为.exe

    添加参数 “- o <执行文件路径(含文件名)>” 即可指定编译的文件位置,需要加上文件名和后缀(Windows为.exe;linux可不要)

go基础介绍相关代码:

package main

import (
    "fmt"
    "time"
)

func main() {
    //   bingfa()

    // go pi_pie()

    //a := my_sum(10,20)
    //fmt.Println(a)

    x,y:=p_fun(10,80)
    // x,_ := p_fun(10,80) 多返回值函数时,只要一个返回值
    fmt.Println(x,y)

    time.Sleep(2 * time.Second) //主进程停留2秒,否则并发线程还没有开启并执行完就结束了
}

//go的高并发
func bingfa() {
    for i := 0; i <= 100; i++ {
        go fmt.Println(i) //go关键字即表示开启一个线程(轻量级的线程goroute)
    }
}

//goroute线程之间使用管道进行数据通信
func pi_pie() {
    pipe := make(chan int, 10) //make关键字创建一个管道(关键字chan),管道内装int类型的数据,并且管道大小能装10个数字,超过则阻塞
    pipe <- 10                 //向管道内放入数据
    pipe <- 9
    pipe <- 9
    pipe <- 7
    pipe <- 6
    var p1 int
    p1 = <-pipe //从管道取出数据
    fmt.Println(p1)
    fmt.Println(len(pipe))
}

//带返回值的函数
func my_sum(a int,b int) int {  //函数传入2个参数,类型为整型,返回值也为整型
    sum := a+b
    return sum
}

//多返回值函数
func p_fun(a int,b int) (int,int) { //函数传入2个整型参数,返回2个值,都为int类型
    sum := a+b
    avg := (a+b)/2
    return sum,avg
}

go开发部分插件无法安装解决方案:

官方的安装文档是使用 go get github.com/tools/godep ,很可惜,因为“网络”问题会报一个 找不到golang.org/x/tools/go/vcs 的错误。

然而 https://github.com/golang/tools 是 golang.org/x/tools 的一个镜像,代码是一样的,所以我是如下安装的:

  • 1.执行命令 go get github.com/golang/tools

  • 2.在 GOPATH\src\github.com\golang 目录下就有tools文件夹。

  • 3.在src下和github.com平级新建golang.org文件下,在此文件夹下建x文件夹,然后将tools文件夹都复制进去。

  • 4.然后再执行 go get github.com/tools/godep

此时godep安装在你的GOPATH\bin目录下。

对其他类似 golang.org/x/tools/go/vcs 的错误的办法也管用


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

设计心理学

设计心理学

Donald Norman / 梅琼 / 中信出版社 / 2003-10-1 / 23.00

设计心理学,ISBN:9787800739255,作者:(美)唐纳德·A.·诺曼(Donald A. Norman)著;梅琼译;梅琼译一起来看看 《设计心理学》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

SHA 加密
SHA 加密

SHA 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具