56

2018年Go语言实战笔记1

 5 years ago
source link: https://studygolang.com/articles/13716?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

含着金钥匙出生的go

近几年,各编程语言中,最火的莫过于Go了。

Go诞生于Google, 是由以下三位计算机领域的大师写的

j2QFrqy.png!web

Go的亲爹们

由于出身名门,Go在诞生之初就吸引了大批开发者的关注。诞生十年以来,已经有很多基于Go的应用,一直有传言Go在将来是要取代现在Java的位置。对于一门只有十年历史的新语言,Go的发展势头是相当迅猛的。

国外的docker就是用Go写的,国内的七牛团队广泛使用Go。而今如火如荼的区块链技术更是将Go推上了热潮

听起来这么牛逼的技术,少年,你不想学下么?

go环境搭建

官网 下载go的安装包

如果是mac,可直接用brew安装:

brew intall go

查看go版本

☁  go [master] :zap: go version
go version go1.10.2 darwin/amd64

关于编辑器,推荐使用jetbrains出品的 golang

第一个go程序

按照官网的demo,运行第一个go程序

新建hello.go文件

package main

import "fmt"

func main() {
    fmt.Println("Hello, 世界")
}

运行go可以有两种方式:

  1. 类似于python,php这样的脚本语言,直接运行,一步到位
☁  demo [master] :zap: go run hello.go                                                    
Hello, 世界
  1. 如java,c++ 一样,要进行编译,再运行编译输出的可执行文件
☁  demo [master] :zap: go build hello.go # 生成可执行文件 hello
☁  demo [master] :zap: ls
hello    hello.go
☁  demo [master] :zap: ./hello # 运行可执行文件   
Hello, 世界
nYjiErb.png!web

代码解析

go是一门有着语法洁癖的语言,如强制规定了大括号的写法。长期以来,关于大括号是否要另起一行,是程序员界的圣战,且这个圣战跨越了语言,操作系统,编辑器。战斗双方多年来厮杀无数回合,不分胜负。python之父Guido van Rossum直接取消了大括号,完全采用缩进,绕过了圣战。与之相比,go就显得很霸道了,直接下了死命令:

"大括号只能在当前行开始,不能另起一行,另起一行是异教徒,直接编译出错!"

让我们来试下:

JfaAjaN.png!web

大括号报错

对于另起一行的强迫症程序员,想用go,惟有屈服。

此外,如果程序中有冗余变量,或引入了没有用到的包,都会报错

package main

import "fmt" // 引入了fmt包,但没有使用

func main() {
}

报错:

☁  demo [master] :zap: go build hello.go
# command-line-arguments
./hello.go:3:8: imported and not used: "fmt"
AZVVB3z.png!web

变量声明后不用

对于从其他语言转过来的程序员,一开始会不习惯go的霸道规定,尤其是我大PHP程序员。PHP的规范是出了名的松散,随便写都行,程序员在写代码时是挺爽的,怎么开心怎么来,但是要维护别人的代码就感到很恶心了。

go的设计理念既简洁又严谨,用强制性的规则保证了代码的一致性。

变量

go在定义变量的规范上,有些反人类。c++, java 都是在变量名之前声明数据类型,而go却别出心裁的将数据类型声明置于变量名后面。

命名规则

变量的命名规则:以字母或下划线开头,对大小写敏感。不能使用go的保留关键字

6baInqA.png!web

go保留关键字

作用域

  1. 在代码块声明的变量,只在块内有效
BJraqmm.png!web

变量作用域

  1. 在函数内部声明的变量,只在函数内有效
NZveaeV.png!web

函数内部变量

  1. 在函数外部声明的变量,在整个包内都有效。如果变量名称是大写的,即在整个程序中都有效
YRv6zun.png!web

包内全局变量

如果变量名要共享到其他包,就需要将包名改成大写

创建以下目录结构:

☁  demo [master] :zap: tree -L 2
.
├── main
│   └── main.go
└── test
    └── test.go

main.go

package main

import (
    "fmt"
    "../test" // 引入test包
)

func main() {
    fmt.Println(test.NAME) // 获取test包的NAME变量
}

test.go

package test

var NAME = "章鱼喵" // 变量名大写,才能被其他包引用,类似于java中的public关键字

结果:

☁  demo [master] :zap: go run main/main.go
章鱼喵

你可以试下将test中的NAME改为name,go会报错,小写的变量是模块的私有变量,其他模块无法引用

常量

常量使用 const 关键字表示,常量一旦定义了,就不可再更改。因此常量只适用于布尔型、数字型(整数型、浮点型和复数)和字符串型。

package main

import "fmt"

const name = "章鱼喵"
const say = "喜欢我的文章,点个赞吧,或者赏杯咖啡钱"
const year = 2018

func main() {
    fmt.Println(name)
    fmt.Println(say)
    fmt.Println(year)
}

这种写法显得很啰嗦,可以用更简洁的方式:

package main

import "fmt"

const (
    name = "章鱼喵"
    say = "喜欢我的文章,点个赞吧,或者赏杯咖啡钱"
    year = 2018
)

func main() {
    fmt.Println(name)
    fmt.Println(say)
    fmt.Println(year)
}
☁  demo [master] :zap: go run main/main.go
章鱼喵
喜欢我的文章,点个赞吧,或者赏杯咖啡钱
2018

数据类型

go的数据类型从大类划分为:布尔型,数字类型,字符串类型,派生类型

各个类型的具体说明,请自行查阅 Go 语言数据类型

go是强类型语言,每个变量都要指定类型,如果不指定,go在编译时会自动根据变量的值推导变量的数据类型。

变量的类型不能更改,广大PHP开发者要谨记了,PHP是弱类型语言,同一个变量,可以随时切换存储的数据类型。PHP的变量不好比是一个万能的筐,什么都可以装。而go的变量是专器专用

package main

import "fmt"

func main() {
    var name string = "章鱼喵" // 指定了数据类型为string
    var say = "智慧如你,有什么要说的,要评论区发表吧..." // 可省略数据类型
    //say = 2018 // 编译报错:不能篡改类型
    fmt.Println(name)
    fmt.Println(say)
}
☁  demo [master] :zap: go run main/main.go
章鱼喵
智慧如你,有什么要说的,要评论区发表吧...

值类型与引用类型

  1. 值类型:变量存储的是数据本身,如基本数据类型:字符串,布尔型,数字等

  2. 引用类型:变量存储的是数据所在的内存地址,如:指针,map, chan等

package main

import "fmt"

func main() {
    var content = "跟章鱼喵一起学go吧..." // 值类型
    var pipe = make(chan int, 1) // 引用类型
    fmt.Println(content) // 存储具体数据
    fmt.Println(pipe) // 存储内存地址
}
☁  demo [master] :zap: go run main/main.go
跟章鱼喵一起学go吧...
0xc42005a070

小结

MrqMjiR.png!web

笔记总结

如果觉得本文对你有所帮助,点个赞,或者赏杯咖啡钱,你的认可对我很重要


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK