zoukankan      html  css  js  c++  java
  • Golang-函数、包、变量的作用域

    函数的基本概念

      为完成某一功能的程序指令(语句)的集合,称为函数。

      在 Go 中,函数分为:  自定义函数、系统函数(查看 Go 编程手册)

    函数的基本语法

      

     快速入门案例

       

      包的引出

        1)在实际的开发中,我们往往需要在不同的文件中,去调用其它文件的定义的函数,比如 main.go中,去使用 utils.go 文件中的函数,如何实现? -》包

        2)现在有两个程序员共同开发一个 Go 项目,程序员 xiaoming 希望定义函数 Cal ,程序员 xiaoqiang也想定义函数也叫 Cal。两个程序员为此还吵了起来,怎么办? -》包

      包的原理图

        包的本质实际上就是创建不同的文件夹,来存放程序文件。画图说明一下包的原理

         

       包的基本概念

        说明:go 的每一个文件都是属于一个包的,也就是说 go 是以包的形式来管理文件和项目目录结构的

       包的三大作用

        区分相同名字的函数、变量等标识符

        当程序文件很多时,可以很好的管理项目

        控制函数、变量等访问范围,即作用域

      包的相关说明
        打包基本语法
        package 包 名

      引入包的基本语法
        import "包的路径"

      包使用的快速入门

        包快速入门-Go 相互调用函数,我们将 func Cal 定义到文件 utils.go , 将 utils.go 放到一个包中,当其它文件需要使用到 utils.go 的方法时,可以 import  该包,就可以使用了.

        【为演示:新建项目目录结构】

        

        utils.go 文件

        

         main.go 文件

        

      包使用的注意事项和细节讨论
        1)在给一个文件打包时,该包对应一个文件夹,比如这里的 utils 文件夹对应的包名就是 utils,文件的包名通常和文件所在的文件夹名一致,一般为小写字母。
        2)当一个文件要使用其它包函数或变量时,需要先引入对应的包
          引入方式 1:import "包名"
          引入方式 2:
          import (
            "包名"
            "包名"
          )
          package 指令在 文件第一行,然后是 import 指令。
          在 import 包时,路径从 $GOPATH 的 src 下开始,不用带 src , 编译器会自动从 src 下开始引入
        3)为了让其它包的文件,可以访问到本包的函数,则该函数名的首字母需要大写,类似其它语言的 public ,这样才能跨包访问。比如 utils.go 的

          

         4)在访问其它包函数,变量时,其语法是 包名.函数名, 比如这里的 main.go 文件中

          

         5)如果包名较长,Go 支持给包取别名, 注意细节:取别名后,原来的包名就不能使用了

           

           说明: 如果给包取了别名,则需要使用别名来访问该包的函数和变量。   

        6)在同一包下,不能有相同的函数名(也不能有相同的全局变量名),否则报重复定义
        7)如果你要编译成一个可执行程序文件,就需要将这个包声明为 main , 即 package main .这个就是一个语法规范,如果你是写一个库 ,包名可以自定义

          

    函数的调用机制
      通俗易懂的方式的理解

      

       函数-调用过程

        介绍:为了让大家更好的理解函数调用过程, 看两个案例,并画出示意图,这个很重要
        1)传入一个数+1

            

          对上图说明
          (1)在调用一个函数时,会给该函数分配一个新的空间,编译器会通过自身的处理让这个新的空间和其它的栈的空间区分开来

          (2)在每个函数对应的栈中,数据空间是独立的,不会混淆
          (3)当一个函数调用完毕(执行完毕)后,程序会销毁这个函数对应的栈空间。
        2)计算两个数,并返回

           

       

      return 语句

         基本语法和说明

          

         

        案例演示 1
        请编写要给函数,可以计算两个数的和和差,并返回结果。

         

         案例演示 2

        一个细节说明: 希望忽略某个返回值,则使用 _ 符号表示占位忽略

        

    函数使用的注意事项和细节讨论
      1)函数的形参列表可以是多个,返回值列表也可以是多个。
      2)形参列表和返回值列表的数据类型可以是值类型和引用类型。
      3)函数的命名遵循标识符命名规范,首字母不能是数字,首字母大写该函数可以被本包文件和其它包文件使用,类似 public , 首字母小写,只能被本包文件使用,其它包文件不能使用,类似 privat
      4)函数中的变量是局部的,函数外不生效【案例说明】

        

       5)基本数据类型和数组默认都是值传递的,即进行值拷贝。在函数内修改,不会影响到原来的值。

        

       6)如果希望函数内的变量能修改函数外的变量(指的是默认以值传递的方式的数据类型),可以传入变量的地址&,函数内以指针的方式操作变量。从效果上看类似引用 。

         

       7)Go 函数不支持函数重载

        

       8)在 Go 中,函数也是一种数据类型,可以赋值给一个变量,则该变量就是一个函数类型的变量了。通过该变量可以对函数调用

         

       9)函数既然是一种数据类型,因此在 Go 中,函数可以作为形参,并且调用

          

      10)为了简化数据类型定义,Go 支持自定义数据类型
      基本语法:type 自定义数据类型名 数据类型 // 理解: 相当于一个别名案例:type myInt int // 这时 myInt 就等价 int 来使用了.int

      案例:type mySum func (int, int) int // 这时 mySum 就等价 一个 函数类型 func (int, int)

       举例说明自定义数据类型的使用:

          

       11)支持对函数返回值命名

           

       12)使用 _ 标识符,忽略返回值

        

       13)Go 支持可变参数

        

         (3) 如果一个函数的形参列表中有可变参数,则可变参数需要放在形参列表最后。代码演示:

            

    函数的课堂练习

      题 1

      

       题 2

      

       题 3:请编写一个函数 swap(n1 *int, n2 *int) 可以交换 n1  和 n2 的值

      

     

    函数参数传递方式

      基本介绍
        我们在讲解函数注意事项和使用细节时,已经讲过值类型和引用类型了,这里我们再系统总结一下,因为这是重难点,值类型参数默认就是值传递,而引用类型参数默认就是引用传递。
      两种传递方式
        1)值传递
        2)引用传递
        其实,不管是值传递还是引用传递,传递给函数的都是变量的副本,不同的是,值传递的是值的拷贝,引用传递的是地址的拷贝,一般来说,地址拷贝效率高,因为数据量小,而值拷贝决定拷贝的数据大小,数据越大,效率越低。

      值类型和引用类型
        1)值类型:基本数据类型 int 系列, float 系列, bool, string 、数组和结构体 struct
        2)引用类型:指针、slice 切片、map、管道 chan、interface 等都是引用类型

      值传递和引用传递使用特点

        

         3) 如果希望函数内的变量能修改函数外的变量,可以传入变量的地址&,函数内以指针的方式操作变量。从效果上看类似引用 。这个案例在前面详解函数使用注意事项的

     变量的作用域

      1)函数内部声明/定义的变量叫局部变量,作用域仅限于函数内部

        

       2)函数外部声明/定义的变量叫全局变量,作用域在整个包都有效,如果其首字母为大写,则作用域在整个程序有效

        

       3)如果变量是在一个代码块,比如 for / if 中,那么这个变量的的作用域就在该代码块

        

       变量作用域的课堂练习

          

        输出的结果是: tom tom jack tom

        

     

    函数课堂练习(综合)
      1)函数可以没有返回值案例,编写一个函数,从终端输入一个整数打印出对应的金子塔
      分析思路:就是将原来写的打印金字塔的案例,使用函数的方式封装,在需要打印时,直接调用即可。

        

      2)编写一个函数,从终端输入一个整数(1—9),打印出对应的乘法表
      分析思路:就是将原来写的调用九九乘法表的案例,使用函数的方式封装,在需要打印时,直接调用即可
      代码:

         

       3)编写函数,对给定的一个二维数组(3×3)转置,这个题讲数组的时候再完成

        

  • 相关阅读:
    python字符串字典列表互转
    列表迭代器 ListIterator
    并发修改异常处理
    二月天 案例
    Calendar类
    Date类
    冒泡排序
    内部类
    python第三天
    Layui——checkbox使用
  • 原文地址:https://www.cnblogs.com/Essaycode/p/12642113.html
Copyright © 2011-2022 走看看