37

Go语言初学笔记-和Python的区别

 5 years ago
source link: https://studygolang.com/articles/14297?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诞生于Google, 是由以下三位计算机领域的大师写的

3aArMfQ.png!web

image

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

而今如火如荼的区块链技术更是将Go推上了热潮。IOT设备连接协议也是Go语言开发技术居多。由此可见未来是属于Go和Python的天下。

go环境搭建

官网 下载go的安装包

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

$ brew intall go

查看go版本

$ go version
go version go1.10.3 darwin/amd64

go开发编辑器

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

第一个go程序

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

新建hello.go文件

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

运行go可以有两种方式:

类似于python,php这样的脚本语言,直接运行,一步到位

$ go run hello.go

如java,c++ 一样,要进行编译,再运行编译输出的可执行文件

$ go build hello.go # 生成可执行文件 hello
$ ls
hello    hello.go
$ ./hello # 运行可执行文件,运行速度极快
Hello, 世界

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

RFvYJnJ.png!web

格式规范

对于另起一行的强迫症程序员,想用go惟有屈服。此外,如果程序中有冗余变量,或引入了没有用到的包,都会报错

package main
import "fmt" // 引入了fmt包,但没有使用
func main() {
}

报错:

$ go build hello.go
# command-line-arguments
./hello.go:3:8: imported and not used: "fmt"
MRBnyq7.png!web

抛出错误

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

变量

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

命名规则

变量的命名规则:以字母或下划线开头,对大小写敏感。

Go内置关键字共25个

Ub6VVvb.png!web

内置关键字

Go语言预定义标识符(区分大小写)共38个

muYrAjm.png!web

预定义标识符

Go的注释方法

// :单行注释
/* */ :多行注释

Go程序的一般结构

//当前程序的包名
package main
//导入其它的包
import "fmt"
//全部变量的声明与赋值
var name = "gopher"
//一般类型的声明
type newType int
//结构的声明
type gopher struct{}
//接口的声明
type golang interface{}
//由main函数作为程序入口点启动
func main() {
  fmt.Println("Hello World!")
}

包的导入

别名:
import std "fmt"
省略调用(这样可以不用写包名,直接调用):
import . "fmt"
初始化,但不调用:
import _ "github.com/go-sql-driver/mysql"

可见性规则

只有首字母为大写的才能被其它包调用(类似面向对象里面的属性public 和private)

作用域

1、在代码块声明的变量,只在块内有效

nUbm63e.png!web

代码块声明的变量

2、在函数内部声明的变量,只在函数内有效

bmeIRrq.png!web

函数内部声明的变

3、在函数外部声明的变量,在整个包内都有效。如果变量名称是大写的,即在整个程序中都有效

iQZNvqZ.png!web

函数外部声明的变量

4、如果变量名要共享到其他包,就需要将包名改成大写,创建以下目录结构:

$ 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 = "myname" // 变量名大写,才能被其他包引用,类似于java中的public关键字

运行结果

$ go run main/main.go
myname

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

常量与运算符

1.常量的定义

常量的值在编译时就已经确认

常量的定义格式与变量基本相同

等号右侧必须是常量或者常量表达式

常量表达式中的函数必须是内置函数

//定义单个常量

const a int = 1
const b = "A"
const (
    text = "123"
    length = len(text)
    num = b * 20
)
//同时定义多个变量
const i, j, k = 1, "2", "3"
const (
    text2 ,length2, num2 = "456", len(text2),  k* 10
)

2.常量的初始化规则

在定义常量组时,如果不提供初始值,则表示使用上行的表达式

var a = 1
const (
    b  = a
    //此时报错,因为全局变量在编译时不能确定值,常量必须是编译时能确定值的或使用内置函数获得的值(eg:len())
)
const (
    a = "A"
    b
    c
    //此时 a,b,c都为"A"
)
const (
    a, b = 1, "A"
    c, d
    //a,c为1,b,d为"A"。此时注意下行的常量个数必须与上行数量保持一致
)

3.常量的枚举

使用相同的表达式不代表具有相同的值

iota是常量的计数器,从0开始,组中每定义1个常量自动递增1

通过初始化规则与iota可以达到枚举的效果

每遇到一个const关键字,iota就会重置为0

const (
    a = "A"
    b
    c = iota
    d        //d的值为3,因为在常量组中,定义了4个变量所以iota计数器从0开始计数4次,所以为3
)

4.运算符

//优先级从高到低     
*  /  %  <<  >>  &  &^
=  -  |  ^   
==  !=  <  <=  >= >
&&
||

例子:

/*
6的二进制:0110       第一个
10的二进制:1011       第二个
---------
&  0010  = 2    (两个都是1才为1)
|  1111  = 15   (一个是1就是1)
^  1101  = 13   (两个只有一个是1才是1)
$^ 0100  = 4    (第二个为1则是0,否则与第一位相同)
*/

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK