首页 > 其他分享 >Go语言基础--函数基本介绍及包

Go语言基础--函数基本介绍及包

时间:2024-08-22 14:23:14浏览次数:6  
标签:函数 -- fmt Println func import Go 及包 main

Go 语言(也称为 Golang)的函数是执行特定任务的代码块。它们允许你重用代码,让程序更加模块化和易于维护。在 Go 中,函数可以接收参数(输入值)并返回结果(输出值)。下面详细解释 Go 语言中的函数:

函数定义

函数通过 func 关键字定义。基本结构如下:

func functionName(parameterList) (resultTypeList) {
// 函数体
}
  • functionName 是函数的名称,它遵循 Go 的标识符命名规则(字母、数字、下划线,不能以数字开头)。
  • parameterList 是传递给函数的参数列表,它是可选的。参数之间用逗号分隔。
  • resultTypeList 是函数返回值的类型列表,也是可选的。如果函数不返回任何值,则可以省略返回值类型。如果有多个返回值,它们之间用逗号分隔。
  • 函数体包含了执行任务的代码。

Go语言有自己的内置函数     

1. 错误处理

panic 和 recover:panic 用于中断当前函数的执行,并开始逐层向上执行函数中的延迟(deferred)函数直到程序崩溃。recover 是一个内置的函数,它用来阻止 panic 的继续传播,并捕获到 panic 的值。

package main 

import "fmt"  

func main() {  

    defer func() {  

        if r := recover(); r != nil {  

            fmt.Println("Recovered in main", r)  

        }  

    }()  

    fmt.Println("Calling myFunction")  

    myFunction()  

    fmt.Println("Returned normally from myFunction")  

}  

func myFunction() {  

    panic("A problem!")  

}

2. 类型断言

类型断言:用于访问接口值底层的具体值。

package main  

import (  

    "fmt"  

)  

func main() {  

    var i interface{} = "hello"  

    s := i.(string)  

    fmt.Println(s)  

    // 如果不确定类型,可以使用类型断言的第二种形式,避免panic  

    s, ok := i.(string)  

    if ok {  

        fmt.Println(s)  

    } else {  

        fmt.Println("i is not a string")  

    }  

}

3. 数学运算

len 和 cap:len 返回集合的长度(如字符串、数组、切片、映射或通道的元素个数),cap 返回切片的容量。

package main  

import "fmt"  

func main() {  

    s := "hello"  

    fmt.Println("len(s):", len(s))  

    slice := []int{1, 2, 3, 4, 5}  

    fmt.Println("len(slice):", len(slice))  

    fmt.Println("cap(slice):", cap(slice))  

}

4. 闭包和延迟函数

defer:延迟函数的执行直到包含它的函数即将返回。

package main  

import "fmt"  

func main() {  

    defer fmt.Println("world")  

    fmt.Println("hello")  

}

5. 集合操作

append:用于向切片追加元素,并返回新切片的引用。

package main  

import "fmt"  

func main() {  

    s := []int{2, 3, 5}  

    s = append(s, 7)  

    s = append(s, 2, 13)  

    fmt.Println(s)  

}

6. 复制和比较

copy:用于将切片(slice)、数组(array)或字符串(string)的元素从一个复制到另一个。

package main  

import "fmt"  

func main() {  

    src := []int{2, 3, 4, 5, 6, 7}  

    dst := make([]int, 3)  

    copied := copy(dst, src)  

    fmt.Println(copied, dst)  

}

7. 字符串处理

字符串操作:Go 语言对字符串的处理是直接的,比如使用 + 连接字符串,使用 len 获取字符串长度等。

package main  

import "fmt"  

func main() {  

    str := "hello"  

    fmt.Println(len(str))  

    newStr := str + ", world!"  

    fmt.Println(newStr)  

}

函数案例: 

package main

import(

    "fmt"

   

)

// 定义一个函数,计算并返回整数列表中所有偶数的平方和  

// 参数:numbers []int - 一个整数切片  

// 返回值:int - 所有偶数的平方和  

func sumOfEvenSquares(numbers []int) int {  

    sum := 0 // 局部变量,用于累加偶数的平方和  

    for _, number := range numbers { // 使用range遍历切片  

        if number%2 == 0 { // 判断是否为偶数  

            sum += number * number // 累加偶数的平方  

        }  

    }  

    return sum // 返回累加的结果  

}  

func main() {  

    // 定义一个整数切片  

    numbers := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}  

    // 调用函数,并将结果存储在变量result中  

    result := sumOfEvenSquares(numbers)  

    // 使用fmt.Println打印结果  

    fmt.Println("The sum of squares of even numbers is:", result)  

}

函数包

        函数包作用很大,比如:

1. 代码重用性

函数包允许开发者将一系列相关的函数、类、变量等组织在一起,形成一个独立的模块。当这些函数、类等在多个地方被重复使用时,通过引入函数包,可以极大地提高代码的重用性,减少代码的冗余,使代码更加简洁、易于维护。

2. 项目管理

随着项目规模的扩大,项目中的文件数量会急剧增加。函数包通过提供结构化的代码组织方式,帮助开发者更好地管理项目。通过将具有相似功能的代码组织在同一个包中,开发者可以更容易地理解和维护项目结构,提高开发效率。

3. 命名空间管理

在大型项目中,不同模块之间可能存在函数、变量名冲突的问题。函数包通过提供命名空间的功能,有效地解决了这一问题。每个包内部的函数、变量等都是相对独立的,不会与其他包中的同名元素产生冲突。这样,开发者就可以更加自由地命名函数、变量等,而无需担心命名冲突的问题。

4. 访问控制

函数包还提供了访问控制的功能。通过合理设置包的访问权限,开发者可以控制哪些函数、变量等可以被外部访问,哪些只能被包内部访问。这有助于保护包内部的敏感信息,防止外部代码随意修改包内部的状态。

5. 依赖管理

在复杂的项目中,不同模块之间可能存在相互依赖的关系。函数包通过清晰地定义模块之间的依赖关系,帮助开发者更好地管理项目依赖。当需要更新或替换某个模块时,开发者可以更容易地找到所有依赖该模块的代码,并进行相应的修改。

6. 并行编程

在函数式编程中,函数包还可以帮助实现并行编程。由于函数式编程语言通常具有并行执行的能力,通过将可并行化的任务封装在函数包中,并利用多核处理器的优势,可以显著提高程序的执行效率。

包的基本介绍:

包的本质实际上就是创建不同的文件夹,来存放程序文件。go 的每一个文件都是属于一个包的,也就是说 go 是以包的形式来管理文件和项目目录结构的

案例:

创建两个文件夹一个main 一个demo,分别在其中创建main.go和demo.go 

demo.go的内容:

package dem

import "fmt"

var A int = 100

//函数首字母大写才能跨程序调用

func B(n1 float64, n2 float64, n3 byte) float64 {

    var n4 float64

    switch n3 {

    case '+':

        n4 = n1 + n2

    case '-':

        n4 = n1 - n2

    case '*':

        n4 = n1 * n2

    case '/':

        n4 = n1 / n2

    default:

        fmt.Println("符号错误")

    }

    return n4

}

main.go调用demo.go

package main

import (

    "Goproject/bao/demo"

    "fmt"

)

func main() {

    fmt.Println("demo.go n4=", demo.A)

    var n1 = 9.8

    var n2 = 8.9

    var n3 byte = '+'

    result := demo.B(n1, n2, n3)

    fmt.Printf("result=%.1f\n", result)

}

标签:函数,--,fmt,Println,func,import,Go,及包,main
From: https://blog.csdn.net/qq_59634082/article/details/141362592

相关文章

  • 链表的一些常用函数
    本文用一个相同的主函数和结构体来讲述链表的14种常见函数主函数和结构体#include<stdio.h>#include<stdlib.h>typedefstructnode{ intnum; structnode*p_next;}node;typedefstruct{ nodehead; nodetail;}link;intmain(){ linklnk={0}; li......
  • Cell子刊|最新研究:多种细胞的花样死法均与表观遗传密切相关
    细胞凋亡是哺乳动物细胞中发现的第一种可被调节的细胞死亡形式,由caspase-3和caspase-7执行。活细胞中caspase-3和caspase-7处于休眠状态,当细胞外细胞因子或细胞内应激信号刺激后,caspase-3和caspase-7由上游caspase-8和caspase-9激活,引发凋亡。当caspase-8被抑制时,相同的细胞死......
  • avalonia学习之按钮
    Button按钮是一个对指针动作做出反应的控件(并且有一些键盘等效物)。当指针向下时,它以按下状态的形式呈现视觉反馈。指向指针释放序列的指针被解释为点击;并且这种行为是可配置的。在确定用户是否按下按钮时,始终使用Click事件而不是PointerPressed。单击是特定于按钮的高级......
  • ado.net 操作sqlite
    新建控制台项目安装nuget包Microsoft.Data.Sqlite数据库名字和链接stringdbName="test.db";SqliteConnection?connection=null;try{//创建链接connection=newSqliteConnection($"DataSource={dbName}");//打开链接connection.Open();......
  • Typora
    汇总上面所有帖子的信息,整理后的步骤如下,并提供一种去除左下角“未激活”提示的不完美的修改方案:1.修改Typora安装目录\resources\page-dist\static\js\LicenseIndex.xxxxxxxxx.xxxxxxx.chunk.js,激活主程序查找:e.hasActivated="true"==e.hasActivated,替换:e.hasActivated="true"......
  • 关于Arrays.asList返回List无法新增和删除?
    关于Arrays.asList返回的List无法新增和删除?这个是在写项目的时候发现的,然后就分析了一下源码,得其内部原理复现代码示例:publicclassArraysAsList{publicstaticvoidmain(String[]args){Integer[]array={1,2,3,4,5};List<Integer>list=......
  • Linux-mknod命令
    mknod创建块设备或者字符设备文件。此命令的适用范围:RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora。用法:mknod[选项]...名称类型[主设备号次设备号]选项参数列表:选项说明--version显示命令版本信息--help显示帮助信息-m|--mode=MODE设......
  • 小红书分享踩坑和解决
    ​小红书官方介入链接:小红书分享开放平台下载sdk文件,位置如下图所示 之后可以按照官方文档进行开发,接入也较简单,这里主要是说明一些隐藏的坑点一、分享应用内的文件到小红书(这里主要是指应用包名下的文件内容),需要注意setFileProviderAuthority()这个方法。例如我的代码如下......
  • [1044] AWS Configure
    ToconfiguretheAWSCommandLineInterface(CLI),youcanfollowthesesteps:1.InstalltheAWSCLIIfyouhaven’talreadyinstalledtheAWSCLI,youcandownloadandinstallitfromtheAWSCLIinstallationpage.2.ConfiguretheAWSCLIOnceinstalled......
  • 暑假集训CSP提高模拟27
    暑假集训CSP提高模拟27组题人:@KafuuChinocpp\(T1\)P236.线性只因\(100pts\)诈骗题。部分分正解记\(opt\)表示待选集合,统计\(opt\)中这一位为\(1\)的数并加入临时集合\(tmp\)。若\(tmp\)大小\(\gem\)则加上这一位的贡献并将\(opt\)赋成\(tmp\)......