Golang中哪些选拔lua实行增加详解,Golang中参数字

作者: 韦德国际1946手机版  发布:2019-05-29

前言

至于参数字传送递,Golang文书档案中有那般一句:

前边有篇小说相当的粗浅的分析了一晃golang的服务器如何兑现,还应该有Handler, DefaultServeMux,HandlerFunc的用处。

这段日子在类型中供给动用lua实行扩展,开掘github上有三个用golang编写的lua虚拟机,名字称为gopher-lua.使用后发掘勉强能够,借此分享给大家,下边话相当的少说了,来一块探访详细的牵线吧。

after they are evaluated, the parameters of the call are passed by value to the
function and the called function begins execution.

函数调用参数均为值传递,不是指针传递或引用传递。经测试引申出来,当参数变量为指针或隐式指针类型,参数字传送递格局也是传值(指针本身的copy)

作者们未来1度领悟了DefaultServeMuxGolang中哪些选拔lua实行增加详解,Golang中参数字传送递详解。纵使存放patternhandler的地方,我们称其为路由,那么大家可能会想,既然golang能够完结那个路由,大家是或不是也模仿三个吧?

数据类型

Slice是最常用的数据结构之一,上面以Slice为例,解释Golang的参数字传送递机制。

率先我们须求2个能够保留客户端的伸手的三个器皿(路由)。

lua中的数据类型与golang中的数据类型对应关系小编曾经在文书档案中验证,值得注意的是项目是以L开端的,类型的称呼是以LT早先的.

Slice数据结构如下:

图片 1

image

创设路由结构体

golang中的数据调换为lua中的数据就亟须退换为L起头的种类:

亲自过问代码:
package main

import "fmt"

func main(){
    slice := make([]int, 3, 5)
    fmt.Println("before:", slice)
    changeSliceMember(slice)
    fmt.Println("after:", slice)
}

func changeSliceMember(slice []int) {
    if len(slice) > 1 {
    slice[0] = 9
    }
}

函数施行结果为:

befor:[0 0 0]
after:[9 0 0]
type CopyRouter struct {
  router map[string]map[string]http.HandlerFunc
}
str := "hello"
num := 10
L.LString(str)
L.LNumber(float64(num))
解释:

从数据结构图中可观察,Slice能够知晓成结构体品类,包涵底层数组首元素地址、数组len、体量四个字段,slice对象在参数字传送值经过中,把七个字段的值传递过去了,实际上changeSliceMember函数内slice在内存中的地址和main中的slice内部存款和储蓄器地址区别样,只是字段值是如出壹辙的,而首先个字段Pointer的值就是底层数组首成分地址,因而得以一向改产生分内容

在此地大家成立了贰个像DefaultServeMux的路由。

lua中的数据调换为golang中的数据,项目提供了ToInt,CheckString之类的函数来进展转变,不过那都是必须提前知道类型的,假若不亮堂就亟须举办项目决断:

可以与下部代码做比较,精通:
package main

func main() {
    value := new(int)
    modifyFunc(value)
    println("main:", value)
}

func modifyFunc(value *int) {
    value = nil
    println("modifyFunc:", value)
}

实行结果:

modifyFunc: 0x0
main: 0xc820049f30

能够观察,即便传值为指针,仍未改变变量value在main中的值,因为modifyFunc中value的值为指针,和main中的value值一样,不过俩对象自己是多少个目标,读者可以细细体会

客户端请求存入路由

value := L.Get(1)
switch value.Type() {
case lua.LTString:
case lua.LTTable:
....
}
func (c *CopyRouter) HandleFunc(method, pattern string, handle http.HandlerFunc) {
  if method == "" {
    panic("Method can not be null!")
  }

  if pattern == "" {
    panic("Pattern can not be null!")
  }

  if _, ok := c.router[method][pattern]; ok {
    panic("Pattern Exists!")
  }

  if c.router == nil {
    c.router = make(map[string]map[string]http.HandlerFunc)
  }

  if c.router[method] == nil {
    c.router[method] = make(map[string]http.HandlerFunc)
  }
  c.router[method][pattern] = handle
}

那边还是能够动用gopher-luar来便于的展开项目转变.

那边大家模仿源码中的ServeMux将每1个U宝马X5L所对应的handler保存起来。

本文由韦德国际1946发布于韦德国际1946手机版,转载请注明出处:Golang中哪些选拔lua实行增加详解,Golang中参数字

关键词: Golang 常用插件