GoLangStudy:day2
Go day2
golang语法注意点(续)
1.函数的多返回值写法
package main
import "fmt"
// 单个返回值:定义函数时,传参类型写在形参后,并在花括号前写明返回值类型,不返回值就不写
func test1(a string, b int) int {
fmt.Println("-----test1-----")
fmt.Println("a = ", a)
fmt.Println("b = ", b)
c := 100
return c
}
// 多个返回值(匿名):在花括号前添加一个括号,里面按顺序写明各个返回值类型
func test2(a string, b int) (int, int) {
fmt.Println("-----test2-----")
fmt.Println("a = ", a)
fmt.Println("b = ", b)
return 67, 78
}
// 多个返回值(命名):为返回值命名,返回时为r1,r2赋值后返回
// r1 int,r2 int 也可以写成 r1,r2 int
// r1,r2属于test3函数的形参,若不赋值,初始值为0
func test3(a string, b int) (r1 int, r2 int) {
fmt.Println("-----test3-----")
fmt.Println("a = ", a)
fmt.Println("b = ", b)
r1 = 123
r2 = 345
return
}
func main() {
//声明新变量时使用:=,修改原有变量值时使用=
c := test1("abcd", 13)
fmt.Println("c = ", c)
d, e := test2("bnd", 6)
fmt.Println("d = ", d, "e = ", e)
d, e = test3("test3", 45)
fmt.Println("d = ", d, "e = ", e)
}
输出结果:
-----test1-----
a = abcd
b = 13
c = 100
-----test2-----
a = bnd
b = 6
d = 67 e = 78
-----test3-----
a = test3
b = 45
d = 123 e = 345
2.init方法调用流程
init函数在golang程序中的作用流程:

简单描述:
从main程序向下一层层找包,找到最里面的包后进行分析,完成后调用init函数返回上一层,以此类推直到返回main程序,并在调用main函数之前再次调用init函数,随即退出程序
验证init函数作用:
首先在同一项目内自创建两个包

package1内容:
package lib1
import "fmt"
func init() {
fmt.Println("lib1 init exe...")
}
// 为main函数提供的API
func Lib1Test() {
fmt.Println("lib1 test!!!")
}
package2内容:
package lib2
import "fmt"
func init() {
fmt.Println("lib2 init exe...")
}
// 为main函数提供的API
func Lib2Test() {
fmt.Println("lib2 test!!!")
}
main内容:
package main
import (
//按照项目路径导入自定义包
//路径:项目名/包名
"demo01/lib1"
"demo01/lib2"
)
func main() {
//调用各个包的对外开放API
lib1.Lib1Test()
lib2.Lib2Test()
}
输出结果:
lib1 init exe...
lib2 init exe...
lib1 test!!!
lib2 test!!!
综上所述,init函数可以自定义,并且会按照上述顺序进行调用
在golang中,如果一个函数名的首字母为大写,说明这是一个对外开放函数,可作为包外部API进行调用
相反,如果函数名的首字母为小写,那么此函数只能在当前包内部进行调用
3.import匿名及别名的导包方式
在go中,若导入的包没有被使用,则会被视为语法错误
那如果我们想要导入一个包,但暂时却不想使用它,那该如何做呢?
实例:
main内容:
package main
import (
_ "demo01/lib1"
"demo01/lib2"
)
func main() {
//lib1.Lib1Test()
lib2.Lib2Test()
}
lib1与lib2的内容不变
输出结果:
lib1 init exe...
lib2 init exe...
lib2 test!!!
我们可以看到,lib1虽然没有被使用,但是程序正常调用了lib1的init函数,说明lib1包是被正常导入了的
这就是匿名导入方式,在包名前面加上下划线和空格,那么这个包就会被匿名导入,且后续包内的接口也可以正常使用
同样的,别名导入方式如下:
main内容:
package main
import (
_ "demo01/lib1"
//为lib2起一个别名:mylib2
mylib2 "demo01/lib2"
)
func main() {
//lib1.Lib1Test()
//lib2.Lib2Test()
//调用API时,使用别名进行调用
mylib2.Lib2Test()
}
lib1与lib2的内容不变
输出结果:
lib1 init exe...
lib2 init exe...
lib2 test!!!
在包名很长的时候,别名导包方式可以减少我们的工作量,更加方便的调用包
浙公网安备 33010602011771号