【GO语言卵细胞级别教程】05.项目创建和函数讲解

感谢!点点赞和评论呀!我将继续更新

目录:

0.创建项目

  1. 创建目录
  2. 执行命令加载模块
    cd 02.gostudy目录下
go 复制代码
1.进入目录下
cd 02.gostudy
2.初始化模块变量
go mod init com.gdzs
3.go mod tidy

4.main.go

package main
import (
	"fmt"
	"com.gdzs/goproject/src/com/nsfocus/mystudy"
)
func main(){
	fmt.Println("main")
	mystudy.DemoFunc()
}

5. 01.函数.go文件内容

package mystudy
// 函数模块
import "fmt"
func add(num1 int , num2 int) (int){
	return num1 + num2
}
func DemoFunc(){
	fmt.Println("求和函数")
	sum := add(10, 21)
	fmt.Println("求和结果:", sum)
}

6.执行go run main.go即可 main.go必须要指定相对路径,比如本项目的
D:\07.go\02.gostudy> go run .\goproject\src\com\nsfocus\main\main.go
main
求和函数
求和结果: 31

注意

go mod tidy 的作用如下:

  1. 移除不再使用的依赖:它会检查项目的源代码和导入语句,并删除 go.mod 文件中未使用的依赖模块。这样可以清理项目中不再需要的依赖,减少项目的大小。
  2. 添加缺失的依赖:go mod tidy 会检查项目的源代码,并根据导入语句自动添加缺失的依赖模块到 go.mod 文件中。这样可以确保项目的依赖完整,避免编译错误或运行时错误。
  3. 更新依赖模块:它会根据 go.mod 文件中指定的版本要求,检查并更新依赖模块到可用的最新版本。这样可以确保项目使用的依赖模块是最新的,包含了最新的功能和修复

1.函数的引入

#Go函数

  1. 简介
    函数的定义:就是用于封装重复的内容,做成一个方法,可以输入给你一些输出
    作用:提高代码复用性和可读性
go 复制代码
func 函数名 (形参列表)(返回值类型列表){
  执行语句
  return + 返回值列表
}
  1. 举例
    #Go函数定义
go 复制代码
func add(num1 int, num2 int)(int){
	var sum int =0
	sum = num1 + num2
	return sum
}

2.注意事项

#Go函数注意事项

  1. 函数与函数并列的关系,所以我们定义的函数不能写到main函数中,如下的写法是错误的

  2. 函数名的规范

    1. 和标识符的规范一样:驼峰命名,简单明了
    2. 首字母不能是数字
    3. 首字母大写该函数可以被本包文件以及其他包文件使用类似(java public)
    4. 首字母小写只能被本包文件使用,其他包文件不能使用类似(java private)

3.详细介绍

3.1 形参介绍

  1. 形参可以是0个、1个、多个
    形参作用:接收外来的数据
  2. 返回类型有一个
go 复制代码
package mystudy
// 函数模块
import "fmt"

// 返回值类型有一个,写返回类型
func add(num1 int , num2 int) (int){
	return num1 + num2
}
// 返回值可以不写返回类型,如果只有一个返回类型的话可以不写括号(()
func add2(num1 int, num2 int) int {
	var sum int = 0
	sum = num1 + num2
	return sum
}
func DemoFunc(){
	// fmt.Println("求和函数")
	// sum := add(10, 21)
	// fmt.Println("求和结果:", sum)
	sum2 := add2(19,22)
	fmt.Println("求和结果:", sum2)
}
  1. 返回类型有多个
go 复制代码
package mystudy
// 函数模块
import "fmt"

func add3(num1 int, num2 int)(int, int){
	// 值交换
	return num2, num1
}

func DemoFunc(){
	// fmt.Println("求和函数")
	// sum := add(10, 21)
	// fmt.Println("求和结果:", sum)
	sum2 := add2(19,22)
	fmt.Println("求和结果:", sum2)
	var num1 int = 10
	var num2 int = 20
	fmt.Printf("替换前:sum1:%d, sum2:%d\n", num1, num2)
	num2, num1 = add3(num2, num1)
	fmt.Printf("替换后:sum1:%d, sum2:%d", num1, num2)
}
  1. 想要改变形参的值,需要使用指针。这里传入的是指针,所以可以直接修改得到值
go 复制代码
// 传入指针才可以修改对应变量值
func address(num1 *int){
	fmt.Println(num1)
	*num1 = 100
}
  1. 返回类型不用按照顺序返回,可以使用 (xxx1 int , xxx2 int)
go 复制代码
// 不用指定返回值的类型
func addsub(num1 int, num2 int)(sum int, sub int){
	sum = num1 + num2
	sub = num1 - num2
	// 这里不需要指定返回变量,自动生成return sum ,sub 所以直接写个return即可
	return 
}
  1. 可以传入多个参数:xxx...int
go 复制代码
// 传入多个参数
func mostParams(nums...int){
	for i :=0 ; i< len(nums); i++ {
		fmt.Println("num=",nums[i])
	}
}
mostParams(12,2,3,233,23,32,32)
  1. Golang中函数不支持重载:函数名相同,形参列表不同
  2. 函数也是一种数据类型,可以赋值给一个变量,则该变量就是一个函数类型的变量了,通过该变量可以对函数调用。
go 复制代码
func mostParams(nums...int){
	for i :=0 ; i< len(nums); i++ {
		fmt.Println("num=",nums[i])
	}
}
separator := strings.Repeat("-", 10)
varMostParams := mostParams
fmt.Println(separator)
varMostParams(32,23,88)
  1. 函数当作一个参数进行传递
go 复制代码
func mostParams(nums...int){
	for i :=0 ; i< len(nums); i++ {
		fmt.Println("num=",nums[i])
	}
}
// 函数当作一个参数传递
func funcParams(funcTest func(...int)){
	funcTest(12,12,12)
}
varMostParams := mostParams
func DemoFunc(){
	funcParams(varMostParams)
}
  1. 自定义数据类型
    这里可以理解为别名也可以,但是类型不是func(int)而是myFunc
go 复制代码
type myint int
var num myint = 10
注意这里的myint和int不是同一个类型,这num的类型是 myint类型
----------------------------------------------------
一般用来给函数赋值类型
1.定义一个func(int)的数据类型
type myFunc func(int)
2.定义一个函数testfunc myFunc
func test(testFunc myFunc){
}
3.声明一个变量 变量类型是myFunc
var testMyFunc myFunc
testMyFunc = test
myFunc = oneIntParams
testMyFunc(1)

4.导入包

4.1 基本知识

包主要是为了代码归类更加清晰。

  1. 比如工具包一般有号码校验、字符串拼接、计算和差等,这个时候为了看的清除,利于代码的阅读,需要建立一个包
go 复制代码
1. 创建文件utils.go
2. 写入内容
package utils
// 计算两个数的和,注意要大写 外部才可以访问
func AddNum(num1 int, num2 int){
    // 计算和
    return num1 + num2
}
// 手机号校验
func CheckPhone(iphones string){
	// 代码逻辑
}
......

3. 在其他函数中进行调用
import "模块名称/路径/utils"
utils.AddNum(1,2)

4.2 注意事项

  1. package 导入的包名建议和文件夹保持一致
  2. main包是程序的入口包,一般main函数会放在这个包下,main函数一定要在main包下,否则不能编译执行
  3. 打包语法:package 包名,包名从$GOPATH/src/后开始计算,建议使用go.mod进行管理生成。
go 复制代码
例如
go mod init 模块名称
import 模块名称/路径/utils
  1. 引入包的语法:import "路径"
  2. 导入多个 模块使用
go 复制代码
import (
	"fmt"
	"xxx/xx/xx/xx"
)
  1. 在函数调用的时候前面要定位到所在的包

  2. 首字母大写,函数可以被其他包使用

  3. 一个目录下的不同文件中不能有重复的函数

  4. 包名可以和文件夹名不一样。比如文件夹名称是aaa 那么包名可以是package bbb

  5. 同一个目录下的同级文件归属一个包,同级别的源文件的包声明必须一致

  6. 包是什么

    1. 在程序层面,所有使用相同package 包名 的源文件组成的代码模块
    2. 在源文件层面就是一个文件夹
  7. 导入的包如何取别名

go 复制代码
import(
    myfmt "fmt"
)
myfmt.Println("hello world")

5.init函数

  1. 首先了解下几个概念

    1. 导入包中的全局变量
    2. 导入包中的init函数
    3. main包中的全局变量定义
    4. main包中的init函数
    5. main包中的main函数
      这几个执行的顺序是什么?
      记住一点就是:依赖先加载
      执行顺序
  2. 案例

    main.go

go 复制代码
------------------
package main

import (
	"fmt"
	"com.gdzs/goproject/src/com/nsfocus/mystudy"
)

func init(){
	fmt.Println("init函数执行了")
}

func main(){
	fmt.Println("main")
	// mystudy.DemoFunc()
	mystudy.DemoInit()
}

02.init函数.go

go 复制代码
package mystudy

import "fmt"

var Age int = DemoInit()
var Name string = "中国"

func DemoInit() int{
	fmt.Println("mystudy/init函数被执行")
	return 10
}	
func init(){
	fmt.Println("mystudy/main函数执行")
	fmt.Println("mystudy/main中的Age", Age)
}

执行结果

go 复制代码
mystudy/init函数被执行
mystudy/main函数执行
mystudy/main中的Age 10
init函数执行了
main
mystudy/init函数被执行

6.匿名函数

  1. 简介

    在Go语言中,main函数是程序的入口函数,它是程序执行的起点。在main函数中,可以调用其他函数,但不能再定义函数。

  2. 匿名函数

    1. 可以在main函数中进行定义
    2. 可以不用起名字而可以直接使用
  3. 匿名函数定义

go 复制代码
func (xxx type, xxx type)(xxx){

}
  1. 实战
go 复制代码
package main

import (
	"fmt"
	"com.gdzs/goproject/src/com/nsfocus/mystudy"
)

func init(){
	fmt.Println("init函数执行了")
}

func main(){
	fmt.Println("匿名函数:")
	// 匿名函数
	var num1 int = 10
	var num2 int = 20
	fmt.Println(num1, num2)
	num1 ,num2 = func (num1 int, num2 int)(int, int){
		return num2, num1
	}(num1, num2)
	fmt.Println(num1, num2)
}

// 执行结果
init函数执行了
匿名函数:
10 20
20 10
  1. 将匿名函数赋值给一个变量(该变量就是一个该匿名变量的函数变量)然后就可以调用使用了
go 复制代码
package main

import (
	"fmt"
)

func main(){
	// 匿名函数赋值
	fmt.Println("匿名函数赋值")
	nmFunc := func(num1 int)(int){
		return 10 * num1
	}
	fmt.Println(nmFunc)
	fmt.Println(nmFunc(10))
}

// 输出结果
匿名函数赋值
0x954040
100
  1. 让匿名函数全局生效可以使用全局变量赋值就行了,但是不建议
go 复制代码
package main

import (
	"fmt"
)

// 全局定义
var QJVar = func(num1 int)(int){
	return 10 * num1
}

func main(){
	fmt.Println(QJVar(20))
}
// 输出结果
200
相关推荐
计算机-秋大田1 分钟前
基于Spring Boot的船舶监造系统的设计与实现,LW+源码+讲解
java·论文阅读·spring boot·后端·vue
tyler_download12 分钟前
golang 实现比特币内核:处理椭圆曲线中的天文数字
golang·blockchain·bitcoin
y52364820 分钟前
Javascript监控元素样式变化
开发语言·javascript·ecmascript
IT技术分享社区1 小时前
C#实战:使用腾讯云识别服务轻松提取火车票信息
开发语言·c#·云计算·腾讯云·共识算法
极客代码1 小时前
【Python TensorFlow】入门到精通
开发语言·人工智能·python·深度学习·tensorflow
疯一样的码农1 小时前
Python 正则表达式(RegEx)
开发语言·python·正则表达式
代码之光_19801 小时前
保障性住房管理:SpringBoot技术优势分析
java·spring boot·后端
ajsbxi1 小时前
苍穹外卖学习记录
java·笔记·后端·学习·nginx·spring·servlet
疯狂的程需猿1 小时前
一个百度、必应搜索引擎图片获取下载的工具包
golang·图搜索
&岁月不待人&1 小时前
Kotlin by lazy和lateinit的使用及区别
android·开发语言·kotlin