zoukankan      html  css  js  c++  java
  • 跟着老猫来搞GO,基础语法

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

    变量定义

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

    func variableDefinition()  {
    	var a int
    	var s string
    	fmt.Printf("%d %q
    ",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
    ",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
    ",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
    ",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的条件里可以省略初始条件,结束条件,递增表达式

    写在最后

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

    热爱技术,热爱产品,热爱生活,一个懂技术,懂产品,懂生活的程序员~ 更多精彩内容,可以关注公众号“程序员老猫”。 一起讨论技术,探讨一下点子,研究研究赚钱!
  • 相关阅读:
    数据挖掘与R语言,数据分析,机器学习
    Linux下bash中关于日期函数date的格式及各种用法
    大数据之机器学习(11)
    unsolved 2 db2 issues
    时间是一剂良药,是制作“知识食物”不可或缺的材料
    b,B,KB,MB,GB
    学习数据结构要再学一遍c语言,害,加油吧
    栈(stack)
    堆(heap)
    js计算器(一)
  • 原文地址:https://www.cnblogs.com/kdaddy/p/15496360.html
Copyright © 2011-2022 走看看