当前位置:首页 > 技术知识 > 正文内容

golang编程实练-函数(func)_golang编程语言

maynowei7个月前 (10-02)技术知识79

main.go:

package main

import (
    "fmt"
    "time"
)

// 函数:有多个输入参数,一个输出参数
func add(a int, b int) int {
    return a + b
}

// 函数:输入参数为空,输出参数为空
func Print() {
    println("hello world")
}

// 函数:输入参数为空,有输出参数
func Format(t *time.Time) string {
    return t.Format("2006-01-02 15:04:05")
}

// 函数:从函数体中返回一个指针对象
func Now() *time.Time {
    now := time.Now()
    return &now
}

type Person struct{}

// 类的成员函数: 指针接收器
func (p *Person) Run() {
    println("do something...")
}

// 类的成员函数: 值接收器
func (p Person) Run2() {
    println("do something...")
}

// 函数:结构体值参数
func RunPerson(p Person) {
    p.Run()
}

// 函数:结构体指针参数
func RunPerson2(p *Person) {
    p.Run()
}

type Runner interface {
    Run() // 接口方法申明
}

// 泛型函数
func MyFunc[T Runner](x T) {
    x.Run()
}

// 函数:多返回值
func f2() (int, int) {
    return 1, 2
}

// 函数:函数作为入参
func f3(f func()) {
    f()
}

// 函数:函数作为返回值
func f4() func() bool {
    return func() bool {
        return true
    }
}

// 通常使用最后一个输出参数返回error
func f5(i int) error {
	if i < 0 {
		return errors.New("invalid i")
	}
	return nil
}

// 通常使用最后一个输出参数返回error
func f6(i int) (int, error) {
	if i < 0 {
		return 0, errors.New("invalid i")
	}
	return 10, nil
}

// 递归函数
func factorial(n int) int {
    if n == 0 {
        return 1
    }
    return n * factorial(n-1)
}

// 主函数
func main() {
    // 闭包函数的定义与使用
    f := func(i int) {
        println("i:", i)
    }
    f(10)

    // 函数:多返回值调用
    i1, _ := f2()
    fmt.Printf("i1:%v\n", i1)

    println("done.")
}

说明:

  1. golang中使用func定义函数,函数可以有0或者多个入参,也可以有0或者多个输出参数
  2. 函数名的首字母大写代表public,其他代表package(包可见性)
  3. golang中函数参数没有默认值,没有命名参数,python和仓颉等语言有。
  4. golang中函数可以返回类似元组的多值,这一点挺好的。/通常会使用最后一个输出参数返回error,这是一种编码范式吧
  5. 因为golang是支持GC的,所以可以从一个函数体中返回一个变量指针,该变量对应的数据在不再使用后,会被GC自动回收
  6. golang中函数作为一种数据类型,本身可以被变量定义,被参数传递。函数类型是引用类型。
  7. golang支持闭包(匿名函数),同样的匿名函数可以被当作变量做参数传递
  8. 类的成员函数,可以使用指针接收器,也可以使用值接收器。
  9. 函数支持泛型处理
  10. main是一个应用的主入口函数.

相关文章

Objective C interface(objective什么意思)

在Objective C里面,interface基本可以理解为其他语言里面的class。当然也有些不同。首先我们可以新建一个Objective-C的file。这里我们添加一个MyClass.m和一个M...

go语言并发原语RWMutex实现原理及闭坑指南

1.RWMutex常用方法Lock/UnlockRLock/RUnlockRLocker 为读操作返回一个Locker接 口的对象2. RWMutex使用方法 func main() { var c...

什么?Java 中的锁还有状态?(java中的锁都有哪些类型)

线程如果锁住了某个资源,致使其他线程无法访问的这种锁被称为悲观锁,相反,线程不锁住资源的锁被称为乐观锁,而自旋锁是基于 CAS 机制实现的,CAS又是乐观锁的一种实现,那么对于锁来说,多个线程同步访问...

Oracle标准化部署手册(oracle19c客户端)

很久之前写过一篇11g的windows安装手册, 这次是19c的windows安装手册,面向没有数据库安装部署经验的开发人员或想学习数据库的新手。希望能给想从事dba的入门人员小小的帮助。 毕竟每个高...

采用Oracle OSB总线进行服务注册和接入

做大型企业内部业务系统集成的应该都知道,Oracle SOA套件当前是应用广泛的一个商业集成产品套件,其中包括了OSB服务总线, BPEL业务流程引擎,BPM业务流程管理,ODI大数据服务集成,MFT...

见招拆招:破解Oracle数据库密码(oracle数据库如何解锁)

一.概要本文主要目的,希望通过分享解密方法引起相关人士对网络安全的重视。数据库安全绝不单只数据库本身的安全,和数据库所处的整个环境都有密切关系。本文所说的破解oracle9i、oracle10g、or...