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名称的限制

  1. 同一目录下的同一级go文件,package名称必须相同,否则无法运行。
  2. 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的测试,但要注意有格式要求

  1. 文件名必须以_test.go为结尾,例如fib_test.go;
  2. 函数名需要以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‘(代码片段

golang learning

你知道的Go切片扩容机制可能是错的

[Go] 通过 17 个简短代码片段,切底弄懂 channel 基础

转发 Learning Go?—?from zero to hero

Deformity JSP WebshellWebshell Hidden Learning