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

gccme · · 13409 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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

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就显得很霸道了,直接下了死命令: "大括号只能在当前行开始,不能另起一行,另起一行是异教徒,直接编译出错!" 让我们来试下。

格式规范

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

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

报错:

$ go build hello.go
# command-line-arguments
./hello.go:3:8: imported and not used: "fmt"
抛出错误

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

变量

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

命名规则

变量的命名规则:以字母或下划线开头,对大小写敏感。
Go内置关键字共25个

内置关键字

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


预定义标识符

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、在代码块声明的变量,只在块内有效

代码块声明的变量

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

函数内部声明的变

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

函数外部声明的变量

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,否则与第一位相同)
*/

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:gccme

查看原文:Go语言初学笔记-和Python的区别

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:701969077

13409 次点击  
加入收藏 微博
2 回复  |  直到 2018-08-20 10:38:24
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传