zoukankan      html  css  js  c++  java
  • Golang 函数以及函数和方法的区别

    在接触到go之前,我认为函数和方法只是同一个东西的两个名字而已(在我熟悉的c/c++pythonjava中没有明显的区别),但是在golang中者完全是两个不同的东西。官方的解释是,方法是包含了接收者的函数。到底什么意思呢。

    首先函数的格式是固定的,func+函数名+ 参数 + 返回值(可选) + 函数体。例 

    func main() 
    
    {
    
    fmt.Println("Hello go")
    
    }

    golang中有两个特殊的函数,main函数和init函数,main函数不用介绍在所有语言中都一样,它作为一个程序的入口,只能有一个。init函数在每个package是可选的,可有可无,甚至可以有多个(但是强烈建议一个package中一个init函数)init函数在你导入该package时程序会自动调用init函数,所以init函数不用我们手动调用,l另外它只会被调用一次,因为当一个package被多次引用时,它只会被导入一次。

     

    package mypackage  
    
      
    
    import (  
    
        "fmt"  
    
    )  
    
      
    
    var I int  
    
      
    
    func init() {  
    
        I = 0  
    
        fmt.Println("Call mypackage init1")  
    
    }  
    
      
    
    func init() {  
    
        I = 1  
    
        fmt.Println("Call mypackage init2")  
    
    }  
    View Code

     

    package main  
    
      
    
    import (  
    
        "demo/mypackage"  
    
        "fmt"  
    
    )  
    
      
    
    func main() {  
    
        fmt.Println("Hello go.... I = ", mypackage.I)  
    
    }  
    View Code

     

    运行结果:

    我们可以看到,程序为我们自动调用了两个init函数,并且是按照顺序调用的。

    下面来看方法。

     

    package main  
    
      
    
    import "fmt"  
    
      
    
    type myint int  
    
      
    
    //乘2  
    
    func (p *myint) mydouble() int {  
    
        *p = *p * 2  
    
        return 0  
    
    }  
    
      
    
    //平方  
    
    func (p myint) mysquare() int {  
    
        p = p * p  
    
        fmt.Println("mysquare p = ", p)  
    
        return 0  
    
    }  
    
      
    
    func main() {  
    
        var i myint = 2  
    
        i.mydouble()  
    
        fmt.Println("i = ", i)  
    
        i.mysquare()  
    
        fmt.Println("i = ", i)  
    
    }  
    View Code

      

    运行结果:

     

    我们可以看到方法和函数的区别,方法在func关键字后是接收者而不是函数名,接收者可以是自己定义的一个类型,这个类型可以是structinterface,甚至我们可以重定义基本数据类型。我们可以给他一些我们想要的方法来满足我们的实际工程中的需求,就像上面一样我重定义了int并给了它一个乘2和平法的方法,这里我们要注意一个细节,接收者是指针和非指针的区别,我们可以看到当接收者为指针式,我们可以通过方法改变该接收者的属性,但是非指针类型缺做不到。

    这里的接收者和c++中的this指针有一些相似,我们可以把接受者当作一个class,而这些方法就是类的成员函数,当接收者为指针类型是就是c++中的非const成员函数,为非指针时就是const成员函数,不能通过此方法改变累的成员变量。




  • 相关阅读:
    ASP.NET没有魔法——ASP.NET MVC & 分层
    ASP.NET没有魔法——第一个ASP.NET应用《MyBlog》
    ASP.NET没有魔法——为什么使用ASP.NET
    ASP.NET没有魔法——开篇-用VS创建一个ASP.NET Web程序
    Orchard详解--第九篇 拓展模块及引用的处理
    【原创-算法-实现】异步HTTP请求操作
    000.Introduction to ASP.NET Core--【Asp.net core 介绍】
    新建 ASP.NET Core Web API 项目 -- RESTFul 风格 Hello World!
    新建 ASP.NET Core MVC 项目 -- Hello World!
    新建 .NET Core 项目 -- Hello World!
  • 原文地址:https://www.cnblogs.com/biaogejiushibiao/p/10887631.html
Copyright © 2011-2022 走看看