`

golang的函数与方法,还是有区别的

 
阅读更多

今天看grafana代理的时候,发现函数前面还有参数一样的东西,这和学的东西不一样啊,太让人不淡定了,只能百度一下了。

func (proxy *DataSourceProxy) HandleRequest() {
	if err := proxy.validateRequest(); err != nil {
		proxy.ctx.JsonApiErr(403, err.Error(), nil)
		return
	}

 

如下来自网络:

 

在刚接触GO语言时候,我相信你也会有这种困惑,为什么有的函数名前面有输入参数,而一些却没有,它们是否有差别?确实有差别,没有输入参数,是一般的函数;有输入参数,是结构的方法,输入参数叫做“方法接收者”!GO语言没有类,方法都定义在结构上了!!

官方教程:

函        数:https://tour.go-zh.org/basics/4

结构体方法:https://tour.go-zh.org/methods/1

实例代码:

 

main.go : 引入了“sunylat/demo”包,调用ShowStructFunc() 演示调用结构体函数。

package main
import(
	"sunylat/demo"
)
func main() {
	//演示结构函数
	demo.ShowStructFunc()
}

 demo/structFunc.go : 调用mydata包ShowStructFunc() 

 
package demo
import (
	"sunylat/mydata"
	"fmt"
)
func ShowStructFunc() {
	//声明结构函数输入的变量
	var (
		idIn   string
		nameIn string
	)
	//给结构函数输入的变量赋值
	idIn = "this is id"
	nameIn = "this is name"

	//得到结构
	ts := &mydata.TestStruct{}

	//调用结构函数1
	idOut, nameOut := ts.StructFunc(idIn, nameIn)

	fmt.Println("StructFunc 函数输出\n id : " + idOut + "\n name : " + nameOut)

	//-----------------------------------------------------------------------

	fmt.Println("-----------------------------------------------------------------------")

	//调用结构函数2
	ts2:=ts.StructFunc2(idIn, nameIn)

	fmt.Println("StructFunc2 函数输出\n id : " + ts2.Id + "\n name : " + ts2.Name)

	//-----------------------------------------------------------------------

	fmt.Println("-----------------------------------------------------------------------")

	//调用普通函数
	outPut:=mydata.OrdinaryFunc("this is ","OrdinaryFunc()")

	fmt.Println("OrdinaryFunc 函数输出\n "+outPut)

}

 mydata/export.go : 定义了两个结构方法,返回值不一样 ;定义了一个普通函数,用于区别结构方法和普通函数。

package mydata

//自定义的结构,首字母大写可以被导出,包括里面的字段首字母大写才被输出
type TestStruct struct {
	Id string
	Name string
}

//这是一个结构函数,返回两个值,输入为方法接收者
func (ts *TestStruct) StructFunc (idIn,nameIn string) (idOut,nameOut string){

	ts.Id=idIn;
	ts.Name=nameIn;

	return ts.Id,ts.Name
}

//这是另外一个结构函数,返回结构,输入为方法接收者
func (ts *TestStruct) StructFunc2 (idIn,nameIn string) TestStruct{

	ts.Id=idIn;
	ts.Name=nameIn;

	return *ts
}

//这是普通函数,函数名前面没有方法接收者
func  OrdinaryFunc (input1,input2 string) (outPut string){

	temp:=input1+input2

	return temp
}

 运行结果截图:

技术分享

 

参考:

 

http://www.mamicode.com/info-detail-1692881.html

 

分享到:
评论

相关推荐

    golang 函数以及函数和方法的详解及区别

    golang 函数以及函数和方法的区别 在接触到go之前,我认为函数和方法只是同一个东西的两个名字而已(在我熟悉的c/c++,python,java中没有明显的区别),但是在golang中者完全是两个不同的东西。官方的解释是,方法...

    golang中struct和interface的基础使用教程

    go中的struct类型理解为类,可以定义方法,和函数定义有些许区别;struct类型是值类型。 struct定义 type User struct { Name string Age int32 mess string } var user User var user1 *User = &User{} var ...

    GoLang 逃逸分析的机制详解

    但是 Golang 并不是这样,虽然 Golang 语言里面也有 new。Golang 编译器决定变量应该分配到什么地方时会进行逃逸分析。使用new函数得到的内存不一定就在堆上。堆和栈的区别对程序员“模糊化”了,当然这一切都是Go...

    基于golang的直播平台项目源码+项目说明.zip

    基于golang的直播平台项目源码+项目说明.zip 开始livego项目之前,有些必备的基础需要搞清楚。 > 启动rtmps服务器时候的证书和密钥是什么? 启动rtmps服务器时,先从配置文件中获取了证书和密钥的路径,然后使用 ...

    maxima-tests:Golang面试问题

    切片如何工作,与数组有何不同? 如何在Golang中创建多维数组我需要通过切片传递给函数吗? Golang运行时中发生了什么? goroutine和系统流程之间有什么区别? 在运行Golang程序时如何限制每个系统的线程数,是否...

    Golang 变量申明的三种方式

    Golang 申明变量主要有三种方式:  一是使用 var 关键字,申明包级或函数级变量;  二是使用短变量申明方式,只能申明函数级变量,且需指明变量值;  三是使用 const 关键字,申明包级或函数级常量。 1.var var ...

    gopter:GOlang属性测试仪

    与ScalaCheck的主要区别: 是...去吧 ...但是:不要期望与ScalaCheck中的字体一样安全和美观。 为简单起见, 已成为生成器的一部分。 如有必要,仍可以轻松更改它们。 没有...到目前为止,机长觉得丑陋就很自在...

    leetcode探索卡片再哪里-Interview-Preparation:Leetcode上问题的解决方案,使用Golang和JAVA

    探索区别再哪里Leetcode 问题的解决方案,使用 Golang 和 JAVA。 如果您有兴趣提供帮助或者您有不同编程语言的解决方案,请随时提出拉取请求。 数据结构 数组和字符串 该数组在 Java 中具有固定大小。 ArrayLists ...

    go web编程

    9.1 并发与并行的区别 230 9.2 goroutine 232 9.2.1 使用goroutine 232 9.2.2 goroutine与性能 235 9.2.3 等待goroutine 238 9.3 通道 239 9.3.1 通过通道实现同步 240 9.3.2 通过通道...

    canvas:Canvas是一个基于OpenGL或使用与HTML5 canvas API非常相似的软件渲染的Go图形库

    该库旨在以与Javascript API相似的方式在每个函数上接受很多不同的参数。 尽管Javascript API使用了所有绘制调用都可以访问的上下文,但是所有绘制调用都直接位于画布类型上。 另一个区别是,这里使用了setter而...

    cu:程序包cu提供了到CUDA驱动程序API的惯用接口

    特别是,此程序包与Arne程序包之间的主要区别在于,此程序包返回错误而不是惊慌。 此外,此软件包的另一个目标是为CUDA提供一个惯用的界面。 例如,不是将cuCtxCreate公开为CtxCreate ,而是使用了一个更好的,更...

    go-fork:go-fork为go流程提供类似fork的行为

    叉 Go fork是一个为Go提供...真实的货叉和货叉之间有两个特别重要的区别: Go fork不会从fork继续执行,而是从被调用的point处启动指定的goroutine.Init fork.Init() (通常在main()或init()早期)。 Go fork不会与子

Global site tag (gtag.js) - Google Analytics