Learning go 1
Posted 梁吉林
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Learning go 1相关的知识,希望对你有一定的参考价值。
1、go应用程序的入口
package需要为main,需要有main函数,否则无法运作。
或者说,可运行的go包必须包含package main
package main
import "fmt"
func main() {
fmt.Println("Hello,World")
}
2、函数接收参数
2.1.main函数接收参数
main()不可以直接传参数,这和java不同,go中的main()需要使用os.args来获取命令行传递的参数。
package main
import (
"fmt"
"os"
)
func main() {
fmt.Println("Hello,World")
fmt.Println(os.Args)
fmt.Println("Hello", os.Args[1])
}
liangjilin@liangjilindeMacBook-Pro d1 % go run HelloWorld.go liang jilin
Hello,World
[/var/folders/cj/9wmnjz5x4vn9zkr352rm4v2w0000gn/T/go-build210439109/b001/exe/HelloWorld liang jilin]
Hello liang
可以看到os.args是个数组,数据的第一个元素是执行的指令,后面的元素时给定的参数,依次排列。
2.2.普通函数接收参数
普通函数接收参数和其它语言相同,都是直接接收参数。
package main
import (
"fmt"
)
func main() {
fmt.Println(funFirst(1,2))
}
func funFirst(a int, b int) int {
return a+b
}
3、package名称的限制
- 同一目录下的同一级go文件,package名称必须相同,否则无法运行。
- package的名称不需要和目录名称相同。
4、函数的返回值
4.1.main()函数
main()函数没有具体的返回值,也不支持return形式的返回。
可以使用os.Exit(1)
的方式给出一些状态码。
4.2.普通函数
普通函数和其它语言相同,支持使用return形式的返回,但是return的值需要和函数定义中的返回值类型相同。
func funFirst(a int, b int) int {
return a+b
}
返回值还可以是多个。
func main() {
a,b := funSecond("go", "lang")
fmt.Println(a,b)
}
func funSecond(a string, b string) (string, int) {
return a+b, 99
}
执行结果为 golang 99
返回值还可以被命名!卧槽牛批~
func main() {
fmt.Println(funThird(5))
}
func funThird(a int) (x,y int) {
x = 10 - a
y = 10 + a
return
}
执行结果为 5 15
5、测试方法
go中支持类似junit的测试,但要注意有格式要求
- 文件名必须以_test.go为结尾,例如fib_test.go;
- 函数名需要以Test为起始,参数为一个指针
t *testing.T
,例如func TestOne(t *testing.T)
;
学习的时候使用这种方式也比较方便。
package test
import "testing"
func TestOne(t *testing.T) {
t.Log("I'm carl.liang")
}
6、常量
go中常量的定义和其它语言类似,不同的是go中还可以对常量使用循环赋值的方式。
package test
import "testing"
const (
TFIRST = iota + 1
TSECOND
TTHIRD
)
const TPI = 3.1415926
func TestOne(t *testing.T) {
t.Log(TFIRST,TSECOND,TTHIRD)
t.Log(TPI)
}
=== RUN TestOne
TestOne: case_test.go:14: 1 2 3
TestOne: case_test.go:15: 3.1415926
--- PASS: TestOne (0.00s)
iota是默认的循环赋值的写法,可以看到TFIRST赋值为1,然后TSECOND以及后续都是依次+1,这个方式简化了很多。
这种方式不仅仅限定与数字,也支持位操作。
const (
TONE = iota << 1
TTWO
TTHREE
)
func TestOne(t *testing.T) {
t.Log(TONE, TTWO, TTHREE)
}
=== RUN TestOne
TestOne: case_test.go:20: 0 2 4
--- PASS: TestOne (0.00s)
以上是关于Learning go 1的主要内容,如果未能解决你的问题,请参考以下文章
解决go: go.mod file not found in current directory or any parent directory; see ‘go help modules‘(代码片段
[Go] 通过 17 个简短代码片段,切底弄懂 channel 基础