indices函数返回的就是 indices 文件夹的 namespace,对应文件在namespace/IndicesNamespace.php,然后后面的函数就相当于文件名,她会拼接在 indices 后面,像我们上面请求的文件就是indices/Analyze.php。具体的拼接就是在 namespace/IndicesNamespace.php 这个里面做的,有一个函数如下
/** * $params['index'] = (string) The name of the index to scope the operation * $params['body'] = (array) Define analyzer/tokenizer parameters and the text on which the analysis should be performed * * @param array $params Associative array of parameters * @return array * @see https://www.elastic.co/guide/en/elasticsearch/reference/master/indices-analyze.html */ publicfunctionanalyze(array$params = []) { //获取$params['index'], $params['body'] $index = $this->extractArgument($params, 'index'); $body = $this->extractArgument($params, 'body');
首先在go里面通过首字母大小写决定访问权限首字母大写 = public,首字母小写 = protected or private
假设test.go代码如下
1 2 3 4 5
package test //包名和目录保持一致
funcTest() { }
main.go代码如下
1 2 3 4 5
package main
funcmain() {
}
我们想使用test这个包里面的东西需要使用go mod了
执行go mod init name,name 表示当前包的名称,可以随便取
这个时候会生成go.mod文件,假设刚才执行的是go mod init hello,那么我们的go.mod文件如下
1 2 3
module hello
go 1.17
这个时候我们就可以在main.go引入test.go了,main.go代码如下
1 2 3 4 5 6 7
package main
import"hello/test"//引入hello这个包下面的test包
funcmain() { test.Test() //这里可以使用test包的Test方法了 }
当然了,包名test也可以和目录test不一致,比如test.go文件内容如下
1 2 3 4 5
package test5 //包名和目录不一致
funcTest() { }
我们在main.go依然可以引入,但是需要更改一下调用,或者加个别名
1 2 3 4 5 6 7
package main
import test5 "hello/test"//别名,不用也可以,不过有的会报错
funcmain() { test5.Test() //这里可以使用test5包的Test方法 }
变量
变量的声明有两种方式
var 可以使用在任何地方,不可以重复声明
var [name] [type]
type在变量声明的时候如果有赋值,那么可以省略
var [name] = 1
var 在外面的声明,可以在使用之后声明
var 在局部声明,必须在使用之前声明
:= 只能使用在函数等代码块里面,当有新的参数在左边声明的时候可以重声明
比如
1 2 3 4 5
var a string var b = a //b也是string var a = "123"// 报错,因为a已经声明过了 a, c := "123","456"//不会报错,因为:=可以重声明,但是必须有一个新变量,比如c a, c := "456", "123"//报错,因为a,c都已经声明过了,都是旧变量
var a string funcmain() { a = "1234" as = a //可以赋值 as = astring(a) //可以类型转换 as, ok := interface{}(a).(astring) //可以类型断言 fmt.Println(as, ok, as == a) //可以比较 }
var a string funcmain() { a = "1234" as = a //不可以赋值 as = astring(a) //可以类型转换 as, ok := interface{}(a).(astring) //类型断言失败 fmt.Println(as, ok, as == a) //不可以比较 }
a := [3]int{1,2,3} //3长度的数组 b := a[0,2] //2长度 3容量的切片 c := a[0,1] //1长度 3容量的切片 d := b[0,1] //1长度 3容量的切片 // b c d的底层都是数组a c[0] = 100 fmt.Println(a,b,c,d) //a [100 2 3] b [100 2] c [100] d [100]
type afunc func(string) (int, error) //声明一个类型 afunc afunc的底层类型是一个接受一个string参数,返回一个int参数和一个error类型参数的函数 var a afunc //可以声明一个变量,类型是 afunc 的变量 a = name //可以把函数签名一致的函数赋值给这个函数变量 a(1,2) //等于 name(1,2)
结构体
结构体的声明
1 2 3 4 5 6 7 8
type as struct{ //声明一个名称叫 as 的结构体 a string//as 有 一个string的属性 a b int//一个int的属性b } //声明一个属于as结构体的方法String func(this as) String() string{ return fmt.Sprintf(this.a) //访问as的属性a }
funcmain() { for i := 0; i < 10; i++ { gofunc(i int) { fmt.Println(i) }(i) } time.Sleep(time.Millisecond * 500) }
for循环
for循环和别的语言一样
1 2 3
for i:=0; i< 10; i++ { //... }
还有 range 可以循环数组,切片,map。这里range会复制一个 numbers3 来进行循环,也就是说如果numbers3是数组,那么修改numbers3[0] 的值不会影响到 numbers3[0] 的值,因为数组是值类型。如果是切片那么会影响到。
1 2 3 4 5 6 7 8 9 10 11 12 13
numbers2 := []int{1, 2, 3, 4, 5, 6} numbers3 := numbers2[0:len(numbers2)] maxIndex2 := len(numbers2) - 1 // i v对应key value,也可以只有一个key,没有value for i := range numbers3 {} for i, v := range numbers3 { //range 后面跟一个切片或者数组,map if i == maxIndex2 { numbers3[0] += v } else { numbers3[i+1] += v } v = 1//这里的v因为是int类型,所以修改他的值不会影响到numbers3切片里面的值 } fmt.Println(numbers2, numbers3)
switch3 { case1, 2: a = 1 case"21", 3, 4: //报错 a = 2 } var a int var b uint8 = 3 switch b { case1, 2: a = 1 case3, 40000: //报错,因为40000 不是uint8能表示的 a = 2 } var b uint8 = 3 switch40000 { case1, 2: a = 1 case3, b: //位置换了也是报错 a = 2 }