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

news2025/1/19 13:14:49

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

目录:

  • 感谢!点点赞和评论呀!我将继续更新
  • 0.创建项目
  • 1.函数的引入
  • 2.注意事项
  • 3.详细介绍
    • 3.1 形参介绍
  • 4.导入包
    • 4.1 基本知识
    • 4.2 注意事项
  • 5.init函数
  • 6.匿名函数

0.创建项目

  1. 创建目录
    在这里插入图片描述
  2. 执行命令加载模块
    cd 02.gostudy目录下
    在这里插入图片描述
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. 简介
    函数的定义:就是用于封装重复的内容,做成一个方法,可以输入给你一些输出
    作用:提高代码复用性和可读性
func 函数名 (形参列表)(返回值类型列表){
  执行语句
  return + 返回值列表
}
  1. 举例
    #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. 返回类型有一个
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. 返回类型有多个
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. 想要改变形参的值,需要使用指针。这里传入的是指针,所以可以直接修改得到值
// 传入指针才可以修改对应变量值
func address(num1 *int){
	fmt.Println(num1)
	*num1 = 100
}
  1. 返回类型不用按照顺序返回,可以使用 (xxx1 int , xxx2 int)
// 不用指定返回值的类型
func addsub(num1 int, num2 int)(sum int, sub int){
	sum = num1 + num2
	sub = num1 - num2
	// 这里不需要指定返回变量,自动生成return sum ,sub 所以直接写个return即可
	return 
}

  1. 可以传入多个参数:xxx…int
// 传入多个参数
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. 函数也是一种数据类型,可以赋值给一个变量,则该变量就是一个函数类型的变量了,通过该变量可以对函数调用。
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. 函数当作一个参数进行传递
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
    在这里插入图片描述
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. 比如工具包一般有号码校验、字符串拼接、计算和差等,这个时候为了看的清除,利于代码的阅读,需要建立一个包
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 mod init 模块名称
import 模块名称/路径/utils
  1. 引入包的语法:import “路径”
  2. 导入多个 模块使用
import (
	"fmt"
	"xxx/xx/xx/xx"
)
  1. 在函数调用的时候前面要定位到所在的包

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

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

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

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

  6. 包是什么

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

import(
    myfmt "fmt"
)
myfmt.Println("hello world")

5.init函数

  1. 首先了解下几个概念

    1. 导入包中的全局变量
    2. 导入包中的init函数
    3. main包中的全局变量定义
    4. main包中的init函数
    5. main包中的main函数
      这几个执行的顺序是什么?
      记住一点就是:依赖先加载
      执行顺序
      在这里插入图片描述
  2. 案例
    main.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

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)
}

执行结果

mystudy/init函数被执行
mystudy/main函数执行
mystudy/main中的Age 10
init函数执行了
main
mystudy/init函数被执行

6.匿名函数

  1. 简介
    在Go语言中,main函数是程序的入口函数,它是程序执行的起点。在main函数中,可以调用其他函数,但不能再定义函数。
    在这里插入图片描述

  2. 匿名函数

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

func (xxx type, xxx type)(xxx){

}
  1. 实战
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. 将匿名函数赋值给一个变量(该变量就是一个该匿名变量的函数变量)然后就可以调用使用了
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. 让匿名函数全局生效可以使用全局变量赋值就行了,但是不建议
package main

import (
	"fmt"
)

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

func main(){
	fmt.Println(QJVar(20))
}
// 输出结果
200

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1447371.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣精选算法100道——矩阵区域和 (前缀和专题)

目录 &#x1f388;了解题意 &#x1f388;算法原理 &#x1f388;实现代码 &#x1f388;了解题意 给定一个大小为 m x n 的矩阵 mat 和一个整数 k&#xff0c;你需要计算一个新的矩阵 answer&#xff0c;其中每个 answer[i][j] 表示矩阵 mat 中以坐标 (i, j) 为中心、边…

JavaScript 事件循环:Event Loop

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 事件循环 是 web 开发中的一个核心概念&#xff0c;它是 JavaScript…

【Linux】线程概念和线程控制

线程概念 一、理解线程1. Linux中的线程2. 重新定义线程和进程3. 进程地址空间之页表4. 线程和进程切换5. 线程的优点6. 线程的缺点7. 线程异常8. 线程用途9. 线程和进程 二、线程控制1. pthread 线程库&#xff08;1&#xff09;pthread_create()&#xff08;2&#xff09;pth…

[Doris] Doris的安装和部署 (二)

文章目录 1.安装要求1.1 Linux操作系统要求1.2 软件需求1.3 注意事项1.4 内部端口 2.集群部署2.1 操作系统安装要求2.2 下载安装包2.3 解压2.4 配置FE2.5 配置BE2.6 添加BE2.7 FE 扩容和缩容2.8 Doris 集群群起脚本 3.图形化 1.安装要求 1.1 Linux操作系统要求 1.2 软件需求 1…

Acwing---842.排列数字

排列数字 1.题目2.基本思想3.代码实现 1.题目 给定一个整数 n&#xff0c;将数字 1∼n排成一排&#xff0c;将会有很多种排列方法。 现在&#xff0c;请你按照字典序将所有的排列方法输出。 输入格式 共一行&#xff0c;包含一个整数 n。 输出格式 按字典序输出所有排列方案…

mysql Day05

sql性能分析 sql执行频率 show global status like Com_______ 慢查询日志 执行时间超过10秒的sql语句 profile详情 show profiles帮助我们了解时间都耗费到哪里了 #查看每一条sql的耗时情况 show profiles#查看指定query_id的sql语句各个阶段的耗时情况 show profile fo…

【电路笔记】-并联电感

并联电感 文章目录 并联电感1、概述2、并联电感示例13、互耦并联电感器4、并联电感示例25、并联电感示例36、总结当电感器的两个端子分别连接到另一个或多个电感器的每个端子时,电感器被称为并联连接在一起。 1、概述 所有并联电感器上的压降将是相同的。 然后,并联的电感器…

MATLAB 1:基础知识

MATLAB中的数据类型主要包括数值类型、逻辑类型、字符串、函数句柄、结构体和单元数组类型。这六种基本的数据类型都是按照数组形式存储和操作的。 MATLAB中还有两种用于高级交叉编程的数据类型&#xff0c;分别是用户自定义的面向对象的用户类类型和Java类类型。 1.1.1数值类…

java微服务面试篇

目录 目录 SpringCloud Spring Cloud 的5大组件 服务注册 Eureka Nacos Eureka和Nacos的对比 负载均衡 负载均衡流程 Ribbon负载均衡策略 自定义负载均衡策略 熔断、降级 服务雪崩 服务降级 服务熔断 服务监控 为什么需要监控 服务监控的组件 skywalking 业务…

【白话前端】快速区分webGL,webGPU,unity3D和UE4

在3D图形渲染的渲染领域&#xff0c;很多友友们对上述概念傻傻分不清&#xff0c;站在前端开发角度&#xff0c;我用简单语言说下&#xff0c;结论在文章最后。 一、四者都能进行3D图形渲染 它们之间有一些区别&#xff0c;下面我将对它们进行简单的区分&#xff1a; WebGPU&a…

【STM32 CubeMX】HAL库的本质读写寄存器

文章目录 前言一、HAL库的本质1.1 HAL库的本质是操作寄存器1.2 自己实现HAL_GPIO_WritePin寄存器通过寄存器的操作点灯代码概况Port bit set/reset register寄存器 总结 前言 在嵌入式系统开发中&#xff0c;HAL&#xff08;Hardware Abstraction Layer&#xff09;库是一个重…

HTML世界之第二重天

目录 一、HTML 格式化 1.HTML 文本格式化标签 2.HTML "计算机输出" 标签 3.HTML 引文, 引用, 及标签定义 二、HTML 链接 1.HTML 链接 2.HTML 超链接 3.HTML 链接语法 4.文本链接 5.图像链接 6.锚点链接 7.下载链接 8.Target 属性 9.Id 属性 三、HTML …

GPT4:画一只小怪兽,但是不断升级

请你画一只1级的萌怪兽 请你画一只3级的萌怪兽 请你画一只5级的小怪兽 请你画一只10级的小怪兽 请你画一只50级的怪兽 请你画一只100级的怪兽 怪兽被闪电劈了一下&#xff0c;变成了一只0.1级的可爱小怪兽

UI自动刷新大法:DataBinding数据绑定

之前我们讲了DataBinding在Activity、Fragment、RecyclerView中的基础使用&#xff0c;而那些常规使用方法里&#xff0c;每当绑定的变量发生数据变化时&#xff0c;都需要ViewDataBinding重新设值才会刷新对应UI。而DataBinding通过内部实现的观察者模式来进行自动刷新UI&…

理解JAVA EE设计模式

理解JAVA EE设计模式 在Web应用程序的设计和开发阶段,开发人员在开发类似的项目时可能会遇到相似的问题。每名开发人员可能会遇到的问题找出不同或相似的解决方案。但是,这导致一些时间和精力浪费在为相似的问题寻找解决方案上。因此,要啊节省时间和精力,需要记录常见问题…

基于Spring Boot的足球青训俱乐部管理后台系统,计算机毕业设计(带源码+论文)

源码获取地址&#xff1a; 码呢-一个专注于技术分享的博客平台一个专注于技术分享的博客平台,大家以共同学习,乐于分享,拥抱开源的价值观进行学习交流http://www.xmbiao.cn/resource-details/1757420859554869250

力扣刷题之旅:高阶篇(四)—— 最小生成树算法

力扣&#xff08;LeetCode&#xff09;是一个在线编程平台&#xff0c;主要用于帮助程序员提升算法和数据结构方面的能力。以下是一些力扣上的入门题目&#xff0c;以及它们的解题代码。 --点击进入刷题地址 引言&#xff1a; 在算法领域中&#xff0c;图论是一个重要且有趣…

基于 Python 深度学习的电影评论情感分析系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

去空行小工具Html + Javascript

这是一个平常用到的小工具&#xff0c;为了节省屏幕空间把空行去掉&#xff0c;怕要用的时候找不到故记录在此。 效果图 网页版&#xff0c;放在浏览器里就可以用 <!doctype html> <html><head><meta charset"utf-8"><title>去回车…

MySQL数据库⑨_事务(四个属性+回滚提交+隔离级别+MVCC)

目录 1. 事务的概念和四个属性 2. 事务的支持版本 3. 事务的提交方式 4. 事务的相关演示 4.1 常规操作_回滚_提交 4.2 原子性_演示 4.3 持久性_演示 4.4 begin自动更改提交方式 4.5 单条SQL与事务的关系 5. 事务的隔离级别 5.1 四种隔离级别 5.2 查看与设置隔离级别…