flora222

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程序中的作用流程:

屏幕截图 2026-07-07 230441

简单描述:

从main程序向下一层层找包,找到最里面的包后进行分析,完成后调用init函数返回上一层,以此类推直到返回main程序,并在调用main函数之前再次调用init函数,随即退出程序

验证init函数作用:

首先在同一项目内自创建两个包

屏幕截图 2026-07-07 231323

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!!!

在包名很长的时候,别名导包方式可以减少我们的工作量,更加方便的调用包

posted on 2026-07-08 00:19  Flora2  阅读(3)  评论(0)    收藏  举报

导航