zoukankan      html  css  js  c++  java
  • GoLang(2)

    Go 语言函数

    Go 语言函数定义格式如下:

    func function_name( [parameter list] ) [return_types] {
       函数体
    }

    函数定义解析:

    • func:函数由 func 开始声明
    • function_name:函数名称,函数名和参数列表一起构成了函数签名。
    • parameter list:参数列表,参数就像一个占位符,当函数被调用时,你可以将值传递给参数,这个值被称为实际参数。参数列表指定的是参数类型、顺序、及参数个数。参数是可选的,也就是说函数也可以不包含参数。
    • return_types:返回类型,函数返回一列值。return_types 是该列值的数据类型。有些功能不需要返回值,这种情况下 return_types 不是必须的。
    • 函数体:函数定义的代码集合。

    函数调用

    package main
    
    import "fmt"
    
    func swap(x, y string) (string, string) {     #返回两个值
       return y, x
    }
    
    func main() {
       a, b := swap("Mahesh", "Kumar")            #函数调用
       fmt.Println(a, b)
    }

    函数参数

    传递类型描述
    值传递 值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
    引用传递 引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

     

     

     

    默认情况下,Go 语言使用的是值传递,即在调用过程中不会影响到实际参数。

    值传递

    /* 定义相互交换值的函数 */
    func swap(x, y int) int {
       var temp int
    
       temp = x /* 保存 x 的值 */
       x = y    /* 将 y 值赋给 x */
       y = temp /* 将 temp 值赋给 y*/
    
       return temp;
    }

    引用传递

    /* 定义交换值函数*/
    func swap(x *int, y *int) {
       var temp int
       temp = *x    /* 保持 x 地址上的值 */                          #指针变量
       *x = *y      /* 将 y 值赋给 x */
       *y = temp    /* 将 temp 值赋给 y */
    }
    package main
    
    import "fmt"
    
    func main() {
       /* 定义局部变量 */
       var a int = 100
       var b int= 200
    
       fmt.Printf("交换前,a 的值 : %d
    ", a )
       fmt.Printf("交换前,b 的值 : %d
    ", b )
    
       /* 调用 swap() 函数
       * &a 指向 a 指针,a 变量的地址
       * &b 指向 b 指针,b 变量的地址
       */
       swap(&a, &b)         #&a得到变量的内存地址
    
       fmt.Printf("交换后,a 的值 : %d
    ", a )
       fmt.Printf("交换后,b 的值 : %d
    ", b )
    }
    
    func swap(x *int, y *int) {
       var temp int
       temp = *x    /* 保存 x 地址上的值 */
       *x = *y      /* 将 y 值赋给 x */
       *y = temp    /* 将 temp 值赋给 y */
    }

    Go 语言数组

    Go 语言数组声明需要指定元素类型及元素个数,语法格式如下:

    var variable_name [SIZE] variable_type    #var  数组名称  [数组长度] 数据类型
    var balance [10] float32

    Go 语言支持多维数组,以下为常用的多维数组声明方式:

    var variable_name [SIZE1][SIZE2]...[SIZEN] variable_type
    var threedim [5][10][4]int

    初始化数组

    var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}

    Go 语言指针

    Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。

    什么是指针

    一个指针变量指向了一个值的内存地址。当一个指针被定义后没有分配到任何变量时,它的值为 nil

    var var_name *var-type

    Go 语言结构体

    Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。

    结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。

    结构体表示一项记录,比如保存图书馆的书籍记录,每本书有以下属性:

    • Title :标题
    • Author : 作者
    • Subject:学科
    • ID:书籍ID

    定义结构体

    定义: type+结构体名称+struct { }

    type struct_variable_type struct {
       member definition;
       member definition;
       ...
       member definition;
    }

    这里是将结构体定义成为一个变量类型,定义以后就能用于变量的声明。

    package main
    
    import "fmt"
    
    type book struct {
        titile string
        author string
        subject string
        book_id int
    }
    
    func main(){
    
        var book1 book
        var book2 book
        book1.titile="GO语言"
        book1.author="小明"
        book1.subject="Go语言教程"
        book1.book_id=1
        book2.titile="python语言"
        printBook(book1)
        printbook_prt(&book2)     #输入的参数为变量的内存地址 
    }
    
    func printBook(books book){
        fmt.Printf("Book title : %s
    ",books.titile)  #访问机构体成员,需使用.操作符   结构体.成员名
        fmt.Printf("Book title : %s
    ",books.author)
        fmt.Printf("Book title : %s
    ",books.subject)
        fmt.Printf("Book title : %d
    ",books.book_id)
    }
    func printbook_prt(book *book){
        fmt.Printf("Book title : %s
    ",book.titile)
    }

    Go 语言切片(Slice)     ---长度可变的数组

    定义切片

    你可以声明一个未指定大小的数组来定义切片:

    var identifier []type

    切片不需要说明长度。

    或使用make()函数来创建切片:

    var slice1 []type = make([]type, len)     #len代表切片的初始长度
    
    也可以简写为
    
    slice1 := make([]type, len)

    初始化切片 

     

  • 相关阅读:
    《数据结构》树与二叉树
    C/C++ 一点笔记(1)
    c#中隐藏基类方法的作用
    VS2010 灵活运用快捷操作功能(新手必看)
    C# 之类复制 MemberwiseClone与Clone(深 浅 Clone)
    DLL笔记
    批处理文件
    .NET Remoting(一)
    MSI安装数据库
    关于用户角色权限的一点想法(RBAC)
  • 原文地址:https://www.cnblogs.com/liusouthern/p/9829811.html
Copyright © 2011-2022 走看看