GO千练——包、变量和函数

53 阅读5分钟

概念

每个 Go 程序都是由包构成的,程序从 main 包开始运行。

约定:包名与导入路径的最后一个元素一致。比如,"math/rand" 包中的源码均以 package rand 语句开始。

本程序导入路径 "fmt"、"math/rand"、"time" 来使用这三个包,用来获取打印输出、生成随机数、时间相关的功能。

package main

import (
	"fmt"
	"math/rand"
	"time"
)

func main() {
	// 设置随机数种子
	var seedNum int64 = time.Now().UnixNano()
	rand.Seed(seedNum)

	// 取5次随机数序列
	for i := 0; i < 5; i++ {
		fmt.Printf("My number is %v\n", rand.Intn(100))
	}

	fmt.Println()

	// 睡眠一秒为了生成新的随机数种子
	time.Sleep(time.Second)
	
	// 设置新随机数种子
	seedNum = time.Now().UnixNano()
	rand.Seed(seedNum)
	for i := 0; i < 5; i++ {
		fmt.Printf("My number is %v\n", rand.Intn(100))
	}
}

导入

导入语法如下:

// 第一种:使用分组导入语句,更推荐
import (
	"fmt"
	"math"
    "time"
)

// 编写多个导入语句
import "fmt"
import "math"
import "time"

导出名

在 Go 中,如果一个名字以大写字母开头,那么它就是已导出的,即外部可以进行使用的。

比如:math 包下的 Pi。

package main

import (
	"fmt"
	"math"
)

func main() {
	// 正确
	fmt.Println(math.Pi)

	// 错误:undefined: math.pi
	// fmt.Println(math.pi)
}

函数

函数定义格式

Go 语言函数定义格式如下:

func function_name( [parameter list] ) [return_types] {
   函数体
}

比如:定义加法计算的函数 add。

package main

import "fmt"

func add(a int, b int) int {
	return a + b
}

func main() {
	fmt.Println(add(10, 20))
}

PS:当连续两个或多个函数的已命名形参类型相同时,除最后一个类型以外,其它都可以省略,比如: func add(a , b int) int { }

多值返回

函数可以返回任意数量的返回值,比如:同时计算 a、b 两数的和与差值。

package main

import "fmt"

func sumAndSub(a int, b int) (int,int) {
	var sum = a + b
	var sub = a - b
	return sum, sub
}

func main() {
	sum, sub := sumAndSub(20, 10)
	fmt.Printf("a和b的和为: %v, 差为: %v",sum, sub)
}

命名返回值

Go 的返回值可被命名,它们会被视作定义在函数顶部的变量。直接返回就是没有参数的 return 语句返回已命名的返回值。

好处:如果返回值的名称应当具有一定的明确意义,那么它可以作为文档提供给代码阅读者。

比如以上代码可以调整成:

package main

import "fmt"

func sumAndSub(a int, b int) (sum int, sub int) {
	sum = a + b
	sub = a - b
	return
}

func main() {
	sum, sub := sumAndSub(20, 10)
	fmt.Printf("a和b的和为: %v, 差为: %v", sum, sub)
}

变量

变量的定义

Go 语言变量名由字母、数字、下划线组成,其中首个字符不能为数字。

声明变量的一般形式是使用 var 关键字,请注意变量的类型在最后:

var identifier type

// 一次定义多个变量
var identifier1, identifier2 type

var 语句可以出现在包或函数级别:

package main

import "fmt"

var c, java bool

func main() {
	var num = 0
	fmt.Println(c, java, num)
}

变量的初始化

变量未设置值的话则默认是该值类型的零值(比如int就是0、bool 就是 false),然后我们还可以给变量设置初始化的值。

零值是: 数值类型为 0, 布尔类型为 false, 字符串为 ""(空字符串)。

package main

import "fmt"

var c, java bool = true,true

func main() {
	var num = 10
	fmt.Println(c, java, num)
}

短变量声明

在函数中,简洁赋值语句 := 可在类型明确的地方代替 var 声明。 但是 := 结构不能在函数外使用,原因是函数外的每个语句都必须以关键字开始(var, func 等等)

package main

import "fmt"

// 这里只能用 var
var c, java bool = true,true

func main() {
	num := 10
	fmt.Println(c, java, num)
}

基本类型

Go 的基本类型有

bool

string

int  int8  int16  int32  int64
uint uint8 uint16 uint32 uint64 uintptr

// uint8 的别名
byte  

// int32 的别名
// 表示一个 Unicode 码点
rune 

float32 float64

complex64 complex128

经验:

  1. 默认整数是 int、小数是 float64 类型
  2. 当你需要一个整数值时应使用 int 类型,除非有特殊的理由使用固定大小或无符号的整数类型。
  3. 没有明确初始值的变量声明会被赋予它们的零值。

类型转换

类型转换:表达式 T(v) 将值 v 转换为类型 T。 比如:

var i int = 10
var f float64 = float64(i)
var u uint = uint(f)

// 或者更简洁
i := 10
f := float64(i)
u := uint(f)

类型推导

概念:在声明一个变量而不指定其类型时(即使用不带类型的 := 语法或 var = 表达式语法),变量的类型由右值推导可以得出。

当右边包含未指明类型的数值常量时,新变量的类型就可能是 int, float64 或 complex128 了,这取决于常量的精度:

// i 由类型推导得出是一个int类型
i := 10

// float64
f := 3.142        

// complex128
g := 0.867 + 0.5i 

当右值声明了类型时,新变量的类型与其相同:

var i int

// j 也是一个 int
j := i 

常量

常量的声明与变量类似,只不过是使用 const 关键字。常量可以是字符、字符串、布尔值或数值。 注意:常量不能用 := 语法声明。

package main

import "fmt"

const Pi = 3.14159

func main() {
	const World = "World"
	fmt.Println("Hello", World)
	fmt.Println("Pi=", Pi)
}

请关注公众号【Java千练】,更多干货文章等你来看!

qrcode_for_gh_e39063348296_258.jpg