在调用函数的时候,会给该函数分配一个新的栈区。基本数据类型一般放在栈区,引用类型放在堆区。
Go
语言总支持多个返回值_
,表示占位符Go
语言不支持传统的函数重载(函数名相同,变量不同)func 函数名 (参数列表) (返回值列表){
函数体部分
return 返回值列表
}
// --------
package main
import "fmt"
// 函数也是种数据类型
func test(a,b int){
return a + b
}
func main(){
x := test
res := x(10, 20)
fmt.Println(res)
}
package main
import "fmt"
func calc(a int, b int) res int{
res = a + b
return res // res可以省略
}
func test1(n1 int){
n1 = n1 + 10
fmt.Println("n1=", n1) // 20
}
func main(){
n1 := 20
test1(n1)
fmt.Println("n1=", n1) // 20
}
go
语言中的每个文件都是一个包GOPATH
开始的,从src
下开始,不用带上src
在函数被调用的时候会分配一个新的栈区。栈是先进后出。
package main
improt "fmt"
func test(n int){
if n > 2{
n--
test(n)
}
fmt.Println(n)
}
func main(){
test(4)
}
// 2 2 3
// n=4执行if,n变成3,还有fmt;n=3执行if,n变成2,还有fmt;n=2不执行if,直接输出fmt。
// 调用输出顺序:先进后出
package main
improt "fmt"
func test(n int){
if n > 2{
n--
test(n)
}else{
fmt.Println(n)
}
}
func main(){
test(4)
}
// 结果是 2
// n=3,4满足条件,根本不会执行else语句
// 斐波那契数列实现
package main
import "fmt"
func fibonacii(n int) int {
if n == 1 || n == 2{
return 1
} else{
return fibonacii(n - 1) + fibonacii(n - 2)
}
}
func main(){
res := fibonacii(5)
fmt.Println(res)
}
int\float
bool\string
array
struct
GC
进行垃圾回收。传递效率高
pointer
slice
map
channel
interface
package main
import "fmt"
// 基本数据类型:值传递
func test1(n1 int){
n1 = n1 + 10
fmt.Println("n1=", n1) // 30
}
// 引用传递
func test2(n1 *int){
*n1 = *n1 + 10
fmt.Println("n1=", *n1)
}
func main(){
n1 := 20
test1(n1)
fmt.Println("n1=", n1) // 20
test2(&n1)
fmt.Println("n1=", n1) // 30
}
type myInt int // 相当于是别名;myInt和int不是同一个类型
var num1 myInt
var num2 int
num1 = 40
num2 = int(num1) // 需要强制转换
fmt.Println(num1, num2)
type mySum func(int, int)int // mySum等价于函数类型
Go
语言支持可变参数func sum(args... int) sum int{
//函数体部分
}
// 1到多个参数
func sum(1 int, args...int)sum int{
//函数体部分
}
package main
import "fmt"
// 可变参数必须放在最后
func sum(n1 int, args...int)int{
sum := n1
for i := 0;i<len(args);i++{
sum += args[i]
}
return sum
}
func main(){
res := sum(10,20,20,30,91)
fmt.Println(res)
}
// 两个变量的值交换
package main
import "fmt"
func swap(n1 *int, n2 *int){
t = *n1 // 定义临时变量
*n1 = *n2
*n2 = t
}
func main(){
a := 10
b := 20
swap(&a, &b) // 传入的是地址
fmt.Println(a, b)
}
每个原文件中都有个init函数;在main函数执行之前,先被调用,完成初始化工作。
package main
import "fmt"
var age = test()
func test()int{
fmt.Println("test()...") // 1
}
func init(){
fmt.Println("init()...") // 2
}
func main(){
fmt.Println("main()....age=", age) // 3
}
匿名函数可以多次使用。
package main
import "fmt"
var (
// Fun是全局匿名函数
Fun = func(n1,n2 int)int{
return n1 * n2
}
)
func main(){
// 定义的时候直接调用
res1 := func(n1, n2 int)int{
return n1 + n2
}(10,20) // 直接赋值调用
fmt.Println(res1)
// 将匿名函数赋值给变量
res2 := func(n1, n2 int)int{ // 定义匿名函数
return n1 - n2
}
a := res2(80,20)
fmt.Println(a)
// 调用全局匿名函数
res3 := Fun(1,3)
fmt.Println(rew3)
}
必包=函数+外部引用环境
package main
import "fmt"
fun addNumber() func(int) int{ // 返回值是一个函数
var n int = 10
var str = "hello"
return func(x int)int{
n = n + x
str += string(36) // 36对应的是'$'
fmt.Println("str=", str) // str="hello$" str="hello$$" str="hello$$$"
return n
}
}
func main(){
// 实现累加功能
f := addNumber() // 调用函数
fmt.Printn(f(1)) // 11
fmt.Printn(f(2)) // 13
fmt.Printn(f(3)) // 16
}
延时机制。在函数执行完毕之后及时释放资源。
package main
import "fmt"
func sum(n1, n2 int)int{
// defer:压入栈中
defer fmt.Println("ok1 n1=", n1) // 3 n1=10 这两个值不会改变
defer fmt.Println("ok2 n2=", n2) // 2 n2=20
// 增加部分,不会改变n1和n2的原来的值
n1++
n2++
res := n1 + n2
fmt.Println("ok3 res=", res) // 1 res=32
return res
}
func main(){
res := sum(10,20)
fmt.Println("res=", res) // 4 res=32
}
func test(){
// 关闭文件
file = openfile(文件名)
defer file.close()
// 其他代码
}
func test(){
// 释放数据库资源
connect = openDatabase()
defer connect.close()
// 其他代码
}
package main
import "fmt"
var name = "tom" // 全局变量
func test1(){
fmt.Println(name)
}
func test2(){
name := "jack" // 局部变量
fmt.Println(name)
}
func main(){
fmt.Println(name) // tom
test1() // tom
test2() // jack
test1() // tom
}
package main
import "fmt"
var name = "tom" // 全局变量
func test1(){
fmt.Println(name)
}
func test2(){
name = "jack" // 相当于是修改全局变量
fmt.Println(name)
}
func main(){
fmt.Println(name) // tom
test1() // tom
test2() // jack
test1() // jack
}
package main
import "fmt"
func printPyramid(totalLevel int){
for i:=1; i <= totalLevel;i++{ // i表示层数
// 打印空格
for k := 1;k <= totalLevel - i;k++{
fmt.Print(" ")
}
for j :=1;j <= 2 * i - 1;j++{ // j表示每层打印多少个*
// 打印空金字塔
if j == 1 || j == 2 * i-1 || i == totalLevel {
fmt.Print("*")
} else{
fmt.Print(" ")
}
}
fmt.Println() // 换行操作
}
}
func main(){
// 调用函数
var n int
fmt.Println("请输入层数")
fmt.Scanln(&n)
printPyramid(n)
}