一、golang语言的特性

1.垃圾回收

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

2.天然并发

  • a.从语言层面支持并发,非常简单
  • b.goroute,轻量级线程,创建成千上万个goroute成为可能
  • c.基于CSP(Commnuncating Sequential Process)模型并发
func main() {
go fmt.Println(“hello")
}

3.channel

  • a.管道,类似unix/linux中的pipe
  • b.多个goroute之间通过channel进行通信
  • c.支持任何类型
func test_pipe() {
pipe := make(chan int, 3)
pipe <- 1
pipe <- 2
pipe <- 3 sum = <-pipe
// pipe <- 4 fmt.Println("sum=", sum)
fmt.Println(len(pipe))
}

 4.多返回值

  a.一个函数返回多个值

package main

func clac(a int, b int) (int, int) {
// 多返回值
c := a + b
d := (a + b) / 2 return c, d
}

二、开发环境搭建

1. Go 语言支持以下系统:

  • Linux

  • FreeBSD

  • Mac OS X(也称为 Darwin)

  • Windows

安装包下载地址为:https://golang.org/dl/

如果打不开可以使用这个地址:https://golang.google.cn/dl/

根据操作系统选择对应的安装包,点击安装包进行安装(linux直接解压)

wget -c https://studygolang.com/dl/golang/go1.13.4.linux-amd64.tar.gz
tar -zxvf go1.13.4.linux-amd64.tar.gz -C /usr/lcoal
mkdir /home/gopath

设置环境变量

2.配置环境变量

linux
vi /etc/profile
export GOROOT=/usr/local/go
export GOPATH=/home/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

windows安装的如果是msi安装文件,Go语言的环境变量会自动设置好。如果后面的测试无法通过,可以重新设置环境变量。

set GOBIN=D:\Go\bin        /* 设置go的可执行文件路径 */
set GOPATH=E:\go\project /* 设置工作目录路径 */
set GOROOT=D:\Go /* 设置安装go的根目录 */

第一个golang程序

hello world, 在gopath路径下新建src目录,新建文件hello.go

package main

import "fmt"

func main() {
fmt.Println("hello world")
}

在终端输入go run hello.go,如何成功打印hello world则证明配置成功

3. IDE搭建(vscode)

新建项目目录结构

4. 安装插件

首先打开扩展,搜索Go,点击安装

使用VScode时,当我们安装完go语言扩展时,新建一个go的源码文件,进行保存时,会提示我们需要安装一些go的扩展插件,可别小看这些插件,这些插件都是非常有用的,比如说自动补全等,一般我们都会选择install all去进行安装所有插件,这些插件均是从github上进行下载,但是因为地处中国被墙的原因,大多插件都会下载失败。

这些失败的库,不是没有下载下来,而是依赖的文件在go官网上,导致失败。以下为解决办法:

1、在%GOPATH%\src\ 目录下,建立golang.org 文件夹,并再新建x文件夹。最终目录为 "%GOPATH%\src\golang.org\x\"

2、完成目录切换后,开始下载插件包:

git clone https://github.com/golang/tools.git tools

3、执行完以后,会多一个tools文件夹。

4、打开vsCode终端,切换到 终端,进入“%GOPATH”目录,执行下述命令

注意:下述命令根据需要进行下载,并不是全部都要下载,此处博主仅仅下载了vscode提示需要装的。
go install github.com/ramya-rao-a/go-outline
go install github.com/acroca/go-symbols
go install golang.org/x/tools/cmd/guru
go install golang.org/x/tools/cmd/gorename
go install github.com/josharian/impl
go install github.com/rogpeppe/godef
go install github.com/sqs/goreturns
go install github.com/golang/lint/golint
go install github.com/cweill/gotests/gotests
go install github.com/ramya-rao-a/go-outline
go install github.com/acroca/go-symbols
go install golang.org/x/tools/cmd/guru
go install golang.org/x/tools/cmd/gorename
go install github.com/josharian/impl
go install github.com/rogpeppe/godef
go install github.com/sqs/goreturns
go install github.com/golang/lint/golint
go install github.com/cweill/gotests/gotests
go get -u -v github.com/mdempsky/gocode
go install golang.org/x/tools/cmd/goimports

但是,有一个插件还是安装失败了,这个插件就是golint

下面将介绍golint插件的安装方法,为手动安装,其他插件安装失败均可以采用此方法进行手动安装

手动安装golint插件

手动安装相当于直接从github上将该插件源码下载下来。

1、在vscode终端中我们首先进入%GOPATH%\src\golang.org\x\下,然后执行如下命令进行golint源码包下载:

git clone https://github.com/golang/lint.git lint

2、 然后执行如下命令即可安装成功

go get -u github.com/golang/lint/golint

5. vscode配置

设置位置:文件-首选项-设置-打开json设置,打开json添加如下设置:

 {
"go.autocompleteUnimportedPackages": true,
"go.inferGopath": true,
"go.gotoSymbol.includeImports": true,
"go.useCodeSnippetsOnFunctionSuggest": true,
"go.gocodePackageLookupMode": "go",
} 

参考 https://www.liwenzhou.com/posts/Go/00_go_in_vscode/?tdsourcetag=s_pcqq_aiomsg

三、包的概念

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

实例: 代码目录

add.go

package calc

func Add(a int, b int) int {
return a + b
}

sub.go

package calc

func Sub(a int, b int) int {
return a - b
}

 main.go

package main

import (
"fmt"
"go_dev/day1/package_example/calc"
) func main() {
sum := calc.Add(100, 300)
sub := calc.Sub(100, 300) fmt.Println("sum=", sum)
fmt.Println("sub=", sub)
}

编译

go build -o 输出路径(相对于GOPATH) 包的路径(相对于GOPATH/src)
go build -o bin/calc.exe go_dev/day1/package_example/main 

四、goroute

1. goroute实现并发

goroute.go

package main

import "fmt"

func test_goroute(a int) {
fmt.Println(a)
}

main.go

package main

import "time"

func main() {
for i := 0; i < 100; i++ {
go test_goroute(i)
} time.Sleep(3 * time.Second)
} // go build go_dev/day1/goroute 

2. goroute管道通信

add.go

package goroute

func Add(a int, b int, c chan int) {
sum := a + b
c <- sum
} 

main.go

package main

import (
"fmt"
"go_dev/day1/goroute_example/goroute"
) func main() {
var pipe chan int
pipe = make(chan int, 1)
go goroute.Add(100, 300, pipe)
sum := <-pipe
fmt.Println("sum=", sum)

 

GO语言系列(一)- 初识go语言的更多相关文章

  1. R语言入门(1)-初识R语言

    设置R语言环境为英文环境 其实不设置也行...就是报错提示的内容是中文的话, 会不太好理解.. 1. 首先在用户根目录下cat查看一下, 发现没有.Renviron文件, 这个是R语言的环境配置文件. ...

  2. go语言学习笔记-初识Go语言

    Go语言是怎样诞生的? Go语言的创始人有三位,分别是图灵奖获得者.C语法联合发明人.Unix之父肯·汤普森(Ken Thompson).Plan 9操作系统领导者.UTF-8编码的最初设计者罗伯·派 ...

  3. 初识 go 语言:方法,接口及并发

    目录 方法,接口及并发 方法 接口 并发 信道 结束语 前言: go语言的第四篇文章,主要讲述go语言中的方法,包括指针,结构体,数组,切片,映射,函数闭包等,每个都提供了示例,可直接运行. 方法,接 ...

  4. 初识 go 语言:数据类型

    目录 数据类型 指针 结构体 数组 切片 切片的方法 映射 函数闭包 结束语 前言: go语言的第三篇文章,主要讲述go语言中的数据类型,包括指针,结构体,数组,切片,映射,函数闭包等,每个都提供了示 ...

  5. 初识 go 语言:语法

    目录 语法 for 循环 if 语句 switch 语句 defer 语句 defer 栈 结束 前言: go语言系列第二篇,主要讲述go语言的语法,如循环,if判断,swich语句,defer语句, ...

  6. 初识 go 语言

    目录 go简介 安装 hello world 函数 变量 常量 可见性规则 结束 前言: 最近组内要试水区块链,初步方案定为使用fabirc来弄,而fabric的智能合约就是用go写的,借此机会正好学 ...

  7. Go语言系列(三)之数组和切片

    <Go语言系列文章> Go语言系列(一)之Go的安装和使用 Go语言系列(二)之基础语法总结 1. 数组 数组用于存储若干个相同类型的变量的集合.数组中每个变量称为数组的元素,每个元素都有 ...

  8. 《玩转D语言系列》三、轻松大跃进,把它当C语言先用起来

    前面说过,本系列文章的前提是您懂C语言,懂面向对象中的一些概念,如果没有任何变成基础,从零开始学习D语言将是一个漫长的过程,因为很多概念都要重新诠释,让一个没有基础的人经过漫长的学习过程,然后还找不到 ...

  9. 《玩转D语言系列》二、D语言现状、基本规定和相关资源介绍

    这算是本系列文章的一个序吧,主要是为以后的学习做铺垫,文本分为三个部分,第一部分是对于网上一些比较旧的资料的问题的一些更正,当然我也不可能看过所有的资料,难免会有遗漏.第二部分是D语言最基本的规定,第 ...

  10. 《Go并发编程实战》读书笔记-初识Go语言

    <Go并发编程实战>读书笔记-初识Go语言 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在讲解怎样用Go语言之前,我们先介绍Go语言的特性,基础概念和标准命令. 一. ...

随机推荐

  1. java使用synchronized与Semaphore解决生产者消费者问题对比

    一.synchronized与信号量Semaphore简介 1.synchronized是java中的关键字,是用来控制线程同步的问题最常用的方法. 2.Semaphore是属于java的一个类,同样 ...

  2. Centos7安装搭建NTP服务器和NTP客户端同步时间

    NTP简介: NTP是网络时间协议(Network Time Protocol),它是用来同步网络中各个计算机的时间的协议. 在计算机的世界里,时间非常地重要 例如:对于火箭发射这种科研活动,对时间的 ...

  3. Java Api Consumer 连接启用Kerberos认证的Kafka

    java程序连接到一个需要Kerberos认证的kafka集群上,消费生产者生产的信息,kafka版本是2.10-0.10.0.1: Java程序以maven构建,(怎么构建maven工程,可去问下度 ...

  4. Loj #2321. 「清华集训 2017」无限之环

    Loj #2321. 「清华集训 2017」无限之环 曾经有一款流行的游戏,叫做 *Infinity Loop***,先来简单的介绍一下这个游戏: 游戏在一个 \(n \times m\) 的网格状棋 ...

  5. [LeetCode] 8. 字符串转换整数 (atoi)

    题目链接:https://leetcode-cn.com/problems/string-to-integer-atoi/ 题目描述: 请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先 ...

  6. Linux内核入门到放弃-虚拟文件系统-《深入Linux内核架构》笔记

    VFS的任务并不简单.一方面,它用来提供了一种操作文件.目录及其他对象的统一方法.另一方面,它必须能够与各种方法给出的具体文件系统的实现达成妥协,这些实现在具体细节.总体设计方面都有一些不同之处. 文 ...

  7. python之shell

    import subprocess # 返回命令执行结果 # result = subprocess.call('ls -l', shell=True) # result = subprocess.c ...

  8. 可视化工具Grafana:简介及安装

    随着业务的越发复杂,对软件系统的要求越来越高,这意味着我们需要随时掌控系统的运行情况.因此,对系统的实时监控以及可视化展示,就成了基础架构的必须能力. 这篇博客,介绍下开源的可视化套件grafana的 ...

  9. Java面试准备之多线程

    什么叫线程安全?举例说明 多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或者协同,这个类都能表现出正确的行为,那么就称这个类是线程 ...

  10. SQL 无法连接服务器

    错误信息:provider:SQL Network Interfaces, error:52-无法定位 LOCA Database Runtime 安装.请验证SQL Server Express是否 ...