上次博客中,老猫已经和大家同步了如何搭建相关的GO语言的开发环境,相信在车上的小伙伴应该都已经搞定了环境了。那么本篇开始,我们就来熟悉GO语言的基础语法。本篇搞定之后,其实期待大家可以和老猫一样,能够写出一些比较简单的代码片段。

变量定义

变量的定义其实也是比较简单的,主要就是利用var关键字+变量的名称+变量的类型。例子如下:

func variableDefinition()  {
var a int
var s string
fmt.Printf("%d %q\n",a,s)
}

大家可以比较容易地发现go语言的定义方式比较特别,其变量名称是放在类型之前的。其实个人认为这也是和人的思考方式有关系,有的人在写变量的时候先想到的是名称再想到是类型,而有些人先想到是类型,然后是名称。这里需要注意的是,如果我们不赋予相关的初始值的时候,go语言其实会自带初始化的值,以上的程序通过main函数执行完毕之后,就会输出

0 ""

大家可以试着去写一下,然后运行一下,至于其中的占位符,以及为什么这么写,这个大家可以查阅一下相关的手册。这些属于死知识。

再看下面比较骚的定义,针对多个变量同时赋值的时候,可以这样写

func variableInitialValue(){
var a,b int = 3,4
var s string = "abc"
fmt.Println(a,b,s)
}

演化的再再骚一些,其实可以直接连变量的名称都不写,不同类型的变量可以写在同一行,GO语言会自动识别变量的类型是什么。

func variableDeduction(){
var a,b,c,d = 3,4,"666",true
fmt.Println(a,b,c,d)
}

在GO语法里面咱们甚至连var都不写,直接用:=的方式去初始化变量,具体如下。

func variableShorter(){
a,b,c,d := 3,4,"666",true
fmt.Println(a,b,c,d)
}

但是这种写法只能够在方法体内去写,如果在存在包内作用变量,那么此时就不能这么写必须还是老老实实的用var关键字,或者用var关键字外加括号的形式。代码如下:

var (
aa = 1
bb = "ktdaddy"
cc = true
) func variableDefinition() {
var a int
var s string
fmt.Printf("%d %q\n",a,s)
}

但是以上这些定义有个注意点,无论如何定义,定义好的变量必须得在后续中用到,否则会报语法错误。

以上差不多是所有GO的变量的定义了,咱们来做一下总结。使用var关键字定义变量

  • 变量定义var a,b,c bool
  • 变量初始化var a,b string = "hello","world"
  • 变量可以定义在函数内,也可以定义在包内
  • 当然还以用var()集中来进行变量定义。
  • 编译器可以自动决定类型 var a,b,c,d = 3,4,"666",true
  • 函数内可以使用标记来进行变量定义 a,b,c,d := 3,4,"666",true,但是无法在包内使用,只能在函数内

基本数据类型

上面我们介绍了一下变量的定义,但是我们的变量又有哪些内建变量类型呢?目前主要分为以下大类。

主要看上图的相关的解释说明,至于比较详细的地方,咱们可以在后续使用的过程中慢慢去体会。

常量和枚举

上面和大家介绍了变量的定义方式主要是用var关键字进行定义,其实我们的常量的定义方式也和变量的定义方式有所类似,我们常量的定义方式主要是用const。我们来看一下例子:

func constDefinition(){
const name string = "abc" //类型方式
const name2 = "abc" //省略类型的方式
const name3,age = "abc",19 //同时定义多个变量
const (
name4 = "abc"
nickname = "bcd"
age2 = 23
) //集合一起定义
}

接下来我们再看一下枚举类型。在GO语言中,枚举类型其实是一组特殊的常量。不像java中有专门的enum关键字,我们来看一下具体的DEMO:

func enums(){
const (
cpp = 0
java = 1
golang = 2
python = 3
)
fmt.Println(cpp,java,java,golang,python)
}

这样使用即可,当然还有一种比较简洁的写法,如下

func enums(){
const (
cpp = iota
java
golang
python
)
fmt.Println(cpp,java,java,golang,python)
}

如果使用关键字"iota"的话,后面的值就是一个自增的值。分别为0,1,2,3。再如下相关存储大小的换算

func storage(){
const (
b = 1<<(10*iota)
kb
mb
gb
tb
pb
)
fmt.Println(b,kb,mb,gb,tb,pb)
}

大家不妨去试一下。

上面,我们把所有的变量以及常量的定义和大家分享了一下,大家可以跟着上面的demo自己也手动写一下,接下来咱们就开始进入到程序控制流程的语法中来了。

条件语句

if条件语句

因为比较简单,而且这种语法的熟悉其实是一种记忆的过程,也没有什么为什么好说,所以咱们还是直接上代码。

func ifTest(v int)  int{
if v<100 {
return 50
}else if v>100 && v<300{
return 60
}else{
return 0
}
}

这个主要想说明一下的就是if的条件里面写法上是不需要括号的。

我们使用这个条件语句写一个小的DEMO,这个DEMO主要是从文件中读取内容。

func main() {
const filename = "abc.txt"
contents,error := ioutil.ReadFile(filename)
if error != nil {
fmt.Println(error)
}else {
fmt.Printf("%s\n",contents)
}
}

这样呢就可以读取文件abc.txt中的内容了,当然这个大家最好试一下,语法上的东西还是得自己多动手才能掌握。我们再看另外一种比较骚的写法,我们甚至可以直接把流程写到我们的If条件中。具体如下:

func main() {
const filename = "abc.txt"
if contents,error := ioutil.ReadFile(filename);error !=nil{
fmt.Println(error)
}else {
fmt.Printf("%s\n",contents)
}
}

上面有两个点。

  • if的条件里是可以赋值的
  • if的条件里赋值的变量作用域就在这个If语句里

switch条件语句

同样的我们也是直接看一下代码吧。

func switchTest(a,b int,op string) int{
var result int
switch op {
case "+":
result = a + b
case "*":
result = a * b
fallthrough
case "/":
result = a / b
case "-":
result = a - b
default:
panic("unsupport operate" + op)
}
return result
}

大家比较会发现,我上面写的语句中居然没有break语句。其实go语言还是比较人性的,怕每个语句都写一个break,所以GO的switch会自动break,除非使用fallthrough。大家可以对panic有点疑问,其实这个是一种抛错行为,类似于java中的throw Exception。到此呢,我们的条件语句就和大家同步完了,非常简单,但是要练习一下。

循环语句

for语句

我们来直接看代码,具体的DEMO如下:

sum :=0
for i:=1;i<100;i++{
sum +=i
} //再例如,省略开始,我们写一个整形转二进制的
func convertToBin(n int) string{
result := ""
for ; n>0 ; n /=2 {
lsb :=n%2
result = strconv.Itoa(lsb) + result
}
return result
}
//再例如,省略起始,我们一行行读取一个文本中的信息,并且将其打印出来,此处也是相当于while
func printFile(fileName string) {
file,err := os.Open(fileName)
if err !=nil {
panic(err)
}
scanner := bufio.NewScanner(file)
for scanner.Scan(){
fmt.Println(scanner.Text())
}
}
//甚至咱们可以写成死循环,这样的话就相当于while
for {
fmt.Println("abc")
}

以上有两个注意点:

  • for的条件里不需要括号
  • for的条件里可以省略初始条件,结束条件,递增表达式

写在最后

完成以上基础语法的学习之后呢,其实,我们就可以写出一些稍微复杂一些的代码片段了。上面的例子感兴趣的小伙伴也可以动手去写一下,其实学习一门编程语言没有什么好的办法,最最关键的还是得多多动手才能很好地去熟悉。我是老猫,更多内容,欢迎大家搜索关注老猫的公众号“程序员老猫”。

跟着老猫来搞GO,集跬步而致千里的更多相关文章

  1. 跟着老猫来搞GO-容器(1)

    前期回顾 前面的一章主要和大家分享了GO语言的函数的定义,以及GO语言中的指针的简单用法,那么本章,老猫就和大家一起来学习一下GO语言中的容器. 数组 数组的定义 说到容器,大家有编程经验的肯定第一个 ...

  2. 跟着老猫来搞GO,基础进阶

    回顾一下上一篇博客,主要是和大家分享了GO语言的基础语法,其中包含变量定义,基本类型,条件语句,循环语句.那本篇呢就开始和大家同步一下GO语言基础的进阶. 函数的定义 上次其实在很多的DEMO中已经写 ...

  3. 跟着老猫来搞GO-内建容器Map

    前期回顾 在上面的文章中,老猫和大家分享了GO语言中比较重要的两种数据结构,一种是数组,另外一种是基于数组的slice.本篇文章想要继续和大家分享剩下的容器以及字符字符串的处理. MAP map的定义 ...

  4. 跟着老猫来搞GO,"面向对象"

    前言 之前和大家分享了容器以及相关的基础语法,以及函数,相信如果大家有接触过C++或者java的朋友都晓得面向对象,其实在GO语言中也存在面向对象,但是还是比较简单的,下面我们来看一下GO语言的&qu ...

  5. 跟着老猫一起来学GO,环境搭建

    老猫的GO学习系列博客已经正式发车了,相信大家以前学习一门编程语言的时候也有经验,咱们一般都是从环境开始,在此呢,大家也跟着老猫从最开始的搭建环境开始. GO语言的安装 首先呢,我们开始需要下载GO语 ...

  6. 千里积于跬步——流,向量场,和微分方程[转载]

    在很多不同的科学领域里面,对于运动或者变化的描述和建模,都具有非常根本性的地位--我个人认为,在计算机视觉里面,这也是非常重要的. 什么是"流"? 在我接触过的各种数学体系中,对于 ...

  7. 【vue】跟着老马学习vue-数据双向绑定

    学习了node.js教程,只能说是有了一定的了解,之前也了解了webpack和es6的核心内容,也看过vue2.0的官网教程,并结合视频看过项目,但是理解和运用仍然存在很多问题,接下来的一段时间,跟着 ...

  8. 我用Axure制作了一款火影小游戏 | PM老猫

    Axure不仅仅是一个原型工具,除了原型之外还可以用来制作一些静态网页,这点对于不懂代码或前端的同学来说挺实用.之前整理了一版<Axure函数自查表>,因为感觉内容太多又对前端样式及脚本感 ...

  9. windows+mysql集群搭建-三分钟搞定集群

    注:本文来源:  陈晓婵   <  windows+mysql集群搭建-三分钟搞定集群   > 一:mysql集群搭建教程-基础篇 计算机一级考试系统要用集群,目标是把集群搭建起来,保证一 ...

随机推荐

  1. python列表底层实现原理

    Python 列表的数据结构是怎么样的? 书上说的是:列表实现可以是数组和链表.顺序表是怎么回事?顺序表一般是数组. 列表是一个线性的集合,它允许用户在任何位置插入.删除.访问和替换元素.列表实现是基 ...

  2. python-requests包请求响应时间

    p.p1 { margin: 0; font: 14px "Helvetica Neue"; color: rgba(17, 17, 17, 1) } p.p2 { margin: ...

  3. P7518-[省选联考2021A/B卷]宝石【主席树,二分】

    正题 题目链接:https://www.luogu.com.cn/problem/P7518 题目大意 给出\(n\)个点的一棵树,每个点上有不大于\(m\)的数字. 然后给出一个长度为\(c\)的各 ...

  4. pandas 基础命令

    参考链接:https://github.com/rmpbastos/data_science/blob/master/_0014_Boost_your_Data_Analysis_with_Panda ...

  5. Java程序的种类

    Java程序的种类 Application:Java应用程序,是可以由Java解释器直接运行的程序. Applet:即Java小应用程序,是可随网页下载到客户端由浏览器解释执行的Java程序. Ser ...

  6. NLP与深度学习(六)BERT模型的使用

    1. 预训练的BERT模型 从头开始训练一个BERT模型是一个成本非常高的工作,所以现在一般是直接去下载已经预训练好的BERT模型.结合迁移学习,实现所要完成的NLP任务.谷歌在github上已经开放 ...

  7. Linux7安装redis6

    首先下载软件包并解压 cd /opt wget https://download.redis.io/releases/redis-6.2.5.tar.gz tar -zxvf redis-6.2.5. ...

  8. SphereEx 登陆 ApacheCon Asia|依托 ShardingSphere 可插拔架构体系打造数据应用完整生态

    2021 年 8 月 8 日,ApacheCon 首次亚洲大会于线上正式闭幕.作为久负盛名的开源盛宴,本届 ApacheCon Asia 受到了海内外众多开源领域人士的关注. 作为 Apache 软件 ...

  9. 浅尝装饰器--property装饰器

    [写在前面] 本帖归属于装饰器单元的学习,可以点击关键词'装饰器'查看其他博文讲解 [正文部分] property属性:将类方法用类属性的形式进行调用 class Good: def __init__ ...

  10. diff算法深入一下?

    文章转自豆皮范儿-diff算法深入一下 一.前言 有同学问:能否详细说一下 diff 算法. 简单说:diff 算法是一种优化手段,将前后两个模块进行差异化比较,修补(更新)差异的过程叫做 patch ...