Go语言简介

Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。

罗伯特·格瑞史莫(Robert Griesemer),罗勃·派克(Rob Pike)及肯·汤普逊(Ken Thompson)于2007年9月开始设计Go,稍后Ian Lance Taylor、Russ Cox加入项目。

Go是基于Inferno操作系统所开发的。Go于2009年11月正式宣布推出,成为开放源代码项目,并在Linux及Mac OS X平台上进行了实现,后来追加了Windows系统下的实现。

在2016年,Go被软件评价公司TIOBE 选为“TIOBE 2016 年最佳语言”。 目前,Go每半年发布一个二级版本(即从a.x升级到a.y)

以上内容摘自百度百科

Go开发环境安装

Go语言开发环境配置,网络上已经有很多的教程,建议使用最新的Go版本,并使用 Go model 进行Go包管理

Go官网

Mac环境

Windows环境

Go语言的第一个程序

可以在任意目录下面创建一个 main.go 文件,文件内容如下

建议做好目录规划,方便以后的学习

package main // 包名

// 导入其他包
// 这里可以导入内置包和第三方包
import (
"fmt"
) // 程序的入口函数
func main() {
fmt.Println("hello world!")
}

执行方式:在 main.go 同级目录下运行下面的命令

go run main.go

结果如下

lichengguo@lichengguodeMacBook-Pro ~ % ll main.go
-rw-r--r-- 1 lichengguo staff 74 11 4 16:16 main.go
lichengguo@lichengguodeMacBook-Pro ~ % go run main.go
hello world

变量

Go语言中每一个变量都有自己的类型,并且变量必须要先声明后使用。同一 作用域 内不支持重复声明变量,并且Go语言的变量声明后必须使用,否则会报错(全局声明的变量可以不必必须使用)。

Go语言推荐使用驼峰命名方式,如 studentName 学生姓名

package main

import (
"fmt"
) func main() {
var studentName string // 声明一个变量
studentName = "tom" // 给变量赋值
fmt.Println(studentName)
}

Go语言在声明变量的时候,会自动对变量对应的内存区域进行初始化操作,每个变量都会被初始化成其类型的默认值。例如:

  • 整型 和 浮点型 变量的默认值为 0
  • 字符串变量的默认值为空字符串
  • 布尔型变量的默认值为 false
  • 切片、函数、指针等变量的默认值为 nil
package main

import "fmt"

// 程序的入口函数
func main() {
// 批量声明
var (
age int // 整型
name string // 字符串
isOK bool // 布尔值
testFunc func() // 函数
)
fmt.Println(age)
fmt.Println(name)
fmt.Println(isOK)
fmt.Println(testFunc)
}

执行结果

lichengguo@lichengguodeMacBook-Pro % go run main.go
0
// 注意这一行的结果是空字符串
false
<nil>

其他的变量声明方式

package main

import "fmt"

func main() {
// 1. 声明变量的同时给赋值
var name string = "tom01"
fmt.Println(name) // 2. 一次声明多个变量,并且初始化多个变量
var name1, age1 = "tom02", 20
fmt.Println(name1, age1) // 3. 类型推导,根据值判断该变量是什么类型
var s2 = "20"
fmt.Println(s2) // 4. 简短变量声明,只能在函数内部使用 (比较常用)
s3 := "Hello Go"
fmt.Println(s3) // 匿名变量是一个特殊的变量:_ (在局部声明赋值以后,也可以不被使用,而不报错)
}

执行结果

lichengguo@lichengguodeMacBook-Pro % go run main.go
tom01
tom02 20
20
Hello Go

注意上面提到的变量都是在函数内部声明并且使用的 局部变量

全局变量

package main

import "fmt"

// 全局变量
var (
// 批量声明变量
name01 string
age01 int
) func main() {
// 局部变量 在函数内部声明的变量
var name02 string
var age02 int
fmt.Println(name02, age02)
}

执行结果

从执行结果可以看出:全局变量声明以后不必必须使用,局部变量声明以后必须要使用

lichengguo@lichengguodeMacBook-Pro % go run main.go
0 // 注意这前面是有空字符串的

常量

常量:定义了常量以后不能修改,常量在定义的时候必须赋值。常量在程序运行期间不会改变

声明常量

package main

import (
"fmt"
) // 声明一个常量
const pi = 3.14 // 批量声明常量
const (
statusOk = 200
notFoud = 404
) // 批量声明常量时,如果某一行声明后没有赋值,默认就和上一行一致
const (
n1 = 100
n2
n3
) func main() {
fmt.Println("--- 声明一个常量 ---")
fmt.Println(pi) fmt.Println("--- 批量声明常量 ---")
fmt.Println(statusOk)
fmt.Println(notFoud) fmt.Println("--- 批量声明常量 默认 ---")
fmt.Println("n1:", n1)
fmt.Println("n2:", n2)
fmt.Println("n3:", n3)
}

执行结果

lichengguo@lichengguodeMacBook-Pro % go run main.go
--- 声明一个常量 ---
3.14
--- 批量声明常量 ---
200
404
--- 批量声明常量 默认 ---
n1: 100
n2: 100
n3: 100

常量计数器

iota 是Go语言的常量计数器,只能在常量的表达式中使用

iota 在const关键字出现时将被重置为0,const中每 新增一行 常量声明将使iota计数一次 +1

使用iota能简化定义,在定义枚举时很有用

package main

import (
"fmt"
) const (
a1 = iota //0
a2 //1
a3 //2
) const (
b1 = iota //0
b2 = iota //1
_ = iota //2
b3 = iota //3
) // 插队
const (
c1 = iota //0 iota=0
c2 = 100 //100 iota=1
c3 = iota //2 iota=2
c4 //3 iota=3
) // 多个常量声明在一行
const (
d1, d2 = iota + 1, iota + 2 // d1:1 d2:2
d3, d4 = iota + 1, iota + 2 // d3:2 d4:3
) // 定义量级
const (
_ = iota
KB = 1 << (10 * iota) // 1左移10位,二进制10000000000 转化为十进制1024
MB = 1 << (10 * iota) // 1左移20位 100000000000000000000
GB = 1 << (10 * iota)
TB = 1 << (10 * iota)
PB = 1 << (10 * iota)
) func main() {
fmt.Println("----- a -----")
fmt.Println(a1)
fmt.Println(a2)
fmt.Println(a3) fmt.Println("----- b -----")
fmt.Println(b1)
fmt.Println(b2)
fmt.Println(b3) fmt.Println("----- 插队 -----")
fmt.Println(c1)
fmt.Println(c2)
fmt.Println(c3)
fmt.Println(c4) fmt.Println("----- 多个常量声明在一行 -----")
fmt.Println(d1, d2)
fmt.Println(d3, d4) fmt.Println("----- 定义量级 -----")
fmt.Println(KB)
fmt.Println(MB)
fmt.Println(GB)
fmt.Println(TB)
fmt.Println(PB)
}

执行结果

lichengguo@lichengguodeMacBook-Pro % go run main.go
----- a -----
0
1
2
----- b -----
0
1
3
----- 插队 -----
0
100
2
3
----- 多个常量声明在一行 -----
1 2
2 3
----- 定义量级 -----
1024
1048576
1073741824
1099511627776
1125899906842624

Golang语言系列-01-Go语言简介和变量的更多相关文章

  1. 01 C语言程序设计--01 C语言基础--第1章 C语言概述&第2章 GCC和GDB

    走进嵌入式开发的世界,企业级项目课程让你达到企业嵌入式应用开发要求.名师在线答疑,解决疑难.科学评测体系,系统评估学习.核心项目实........ 30 门课程 241小时12分钟 824 人学习 学 ...

  2. 【GoLang】GO语言系列--002.GO语言基础

    002.GO语言基础 1 参考资料 1.1 http://www.cnblogs.com/vimsk/archive/2012/11/03/2736179.html 1.2 https://githu ...

  3. 01 C语言程序设计--01 C语言基础--第3章 基本数据类型01

    01.1.3.1序言 00:02:17 01.1.3.2 C语言中的基本元素和常量的概念 00:08:54 01.1.3.3示例--常量 00:12:08 01.1.3.4变量的概念和命名规则 00: ...

  4. 【DWR系列01】-DWR简介及入门例子

    .literal { background-color: #f2f2f2; border: 1px solid #cccccc; padding: 1px 3px 0; white-space: no ...

  5. 【R语言系列】R语言初识及安装

    一.R是什么 R语言是由新西兰奥克兰大学的Ross Ihaka和Robert Gentleman两个人共同发明. 其词法和语法分别源自Schema和S语言. R定义:一个能够自由幼小的用于统计计算和绘 ...

  6. 01. Go 语言简介

    Go语言简介 引用原文地址:http://m.biancheng.net/golang/ Go语言也称 Golang,兼具效率.性能.安全.健壮等特性.这套Go语言教程(Golang教程)通俗易懂,深 ...

  7. Golang语言系列-15-数据库

    数据库 MySQL 连接数据库 package main import ( "database/sql" "fmt" _ "github.com/go ...

  8. Java入门 - 语言基础 - 01.Java简介

    原文地址:http://www.work100.net/training/java-intro.html 更多教程:光束云 - 免费课程 Java简介 序号 文内章节 视频 1 概述 2 主要特性 3 ...

  9. 【Go语言系列】1.1、GO语言简介:什么是GO语言

    一.Go的起源 Go语言的所有设计者都说,设计Go语言是因为 C++ 给他们带来了挫败感.在 Google I/O 2012 的 Go 设计小组见面会上,Rob Pike 是这样说的: 我们做了大量的 ...

  10. Golang语言系列-08-结构体

    结构体 自定义类型和类型别名的区别 package main import "fmt" // 自定义类型和类型别名的区别 // type后面跟的是类型 type myInt int ...

随机推荐

  1. sonarqube 8.9版本配置收邮件提醒

    # admin登陆系统后,进入我的账户(每个用户的配置过程类似) sonarqube 8.9版本配置发信请参考我的另一篇博文: 链接如下: https://www.cnblogs.com/cndevo ...

  2. 并发王者课-铂金10:能工巧匠-ThreadLocal如何为线程打造私有数据空间

    欢迎来到<并发王者课>,本文是该系列文章中的第23篇,铂金中的第10篇. 说起ThreadLocal,相信你对它的名字一定不陌生.在并发编程中,它有着较高的出场率,并且也是面试中的高频面试 ...

  3. Docker:虚拟机挂起后,再启动docker容器连接失败

    问题描述 当我们使用VMware15 Pro 创建虚拟机并运行Linux搭建的Docker时,挂起虚拟机后再次运行发现访问Docker容器失败. 解决方式  我们正常的挂起其实是:挂起客户机,博主尝试 ...

  4. SpringCloud:扩展zuul配置路由访问

    继续上次整合SpringCloud的demo进行扩展zuul:https://www.cnblogs.com/nhdlb/p/12555968.html  这里我把zuul划分出一个模块单独启动 创建 ...

  5. com.rabbitmq.client.impl.Frame.readFrom(Frame.java:95)

    RabbitMQ 基于Erlang 实现, 客户端可以用Python | Java | Ruby | PHP | C# | Javascript | Go等语言来实现.这里做个java语言的测试.首先 ...

  6. ESP32低功耗模式

    1.ESP32 系列芯片提供三种可配置的睡眠模式,针对这些睡眠模式,我们提供了了多种低功耗解决方案,用户可以结合具体需求选择睡眠模式并进行配置.三种睡眠模式如下: Modem-sleep 模式:CPU ...

  7. 前端-Vue基础3(父子组件交互)

    1.子组件往父组件传值 点击子组件的值,子组件自增,父组件的值也跟着自增 通过:this.$emit('change')方法向父组件暴露事件,在子组件中引用,可以调用父组件的方法 点击子组件触发cli ...

  8. C语言:GB2312编码和GBK编码,将中文存储到计算机

    计算机是一种改变世界的发明,很快就从美国传到了全球各地,得到了所有国家的认可,成为了一种不可替代的工具.计算机在广泛流行的过程中遇到的一个棘手问题就是字符编码,计算机是美国人发明的,它使用的是 ASC ...

  9. VBA: 带参数带返回值的函数

    Function pda(x) a = x If Len(a) = 1 Then ab = "00" & a ElseIf Len(a) = 2 Then ab = &qu ...

  10. 2021.07.21 NPCBOT增加人类的SS和74

    #ssinsert into `creature_template_npcbot_appearance`(`entry`,`name*`,`gender`,`skin`,`face`,`hair`,` ...