• 【原创】go语言学习(五)函数详解1


    目录

    1、函数介绍

    2、多返回值和可变参数

    3、defer语句

    4、内置函数介绍

    1、函数介绍

    1.1定义:

    有输⼊入、有输出,⽤用来执⾏行行⼀一个指定任务的代码块。

    func functionname([parametername type]) [returntype] {
       //function body 
    }
    //其中参数列列表和返回值列列表是可选
    

      

    1.2⽆无参数和返回值的函数

    func functionname() {
       //function body 
    }
    

      

    1.3实现两个数相加

    // 两数相加
    // 三个整数相加简写:func add(a , b, c int) int{
    func add(a int, b int) int {
    	sum := a + b
    	return sum
    }
    

      

    1.4如何连续的⼀一系列列参数的类型是一样,前⾯面的类型可以不不写如何连续的

    // 多返回值
    // func calc(a, b int) (int, int){
    func calc(a, b int) (sum int, sub int) {
    	sum = a + b
    	sub = a - b
    	// sum := a + b
    	// sub := a - b
    	// return sum, sub
    	//第二中写法
    	return
    }
    

      

    1.5函数调用

    // 多返回值
    // func calc(a, b int) (int, int){
    func calc(a, b int) (sum int, sub int) {
    	sum = a + b
    	sub = a - b
    	// sum := a + b
    	// sub := a - b
    	// return sum, sub
    	//第二中写法
    	return
    }
    
    func main() {
        sum, sub := calc(200 ,100)
        fmt.Printf("%d %d", sum, sub)
    }
    

      

    2、多返回值和可变参数

    2.1多返回值

    func calc(a, b int) (int, int) {
      sum := a + b sub := a - b return sum, sub
    }
    func main() {
          sum, sub := add(2, 3)


      

    2.2对返回值进⾏行行命名

    func calc(a, b int) (sum int, sub int) {
      sum = a + b sub = a - b return 
    } 
    func main() {
          sum, sub := add(2, 3)
 
    } 
    

      

    2.3对返回值进⾏行行命名

    func calc(a, b int) (sum int, sub int) {
      sum = a + b sub = a - b return 
    } 
    
    func main() {
          sum, sub := add(2, 3)
 
    } 
    

      

    2.4_标识符

    func calc(a, b int) (sum int, sub int) {
      sum = a + b sub = a - b return 
    } 
    func main() {
          sum, _ := add(2, 3)
 
    } 
    

      

    2.5 可变参数

    // 可变参数
    func calc_v1(b ...int) int {
    	sum := 0
    	for i := 0; i < len(b); i++ {
    		sum = sum + b[i]
    	}
    	return sum
    }

    // 固定参数和可变参数
    func calc_v2(a int, b ...int) int {
    sum := a
    for i := 0; i < len(b); i++ {
    sum = sum + b[i]
    }
    return sum
    }

      

    3、defer语句

    3.1 多个defer语句句,遵循栈的特性:先进后出 

    // defer返回执行
    // defer作用资源释放
    func testDefer1() {
    	defer fmt.Println("hello")
    	defer fmt.Println("hello v2")
    	defer fmt.Println("hello v3")
    	fmt.Println("aaaaaa")
    	fmt.Printf("bbbbbbbb")
    }
    
    /*
    结果:
    defer,后进先出,压栈
    aaaaaaa
    bbbbbbb
    hello v3
    hello v2
    hello
    */

    func testDefer2() {
    for i := 0; i < 5; i++ {
    defer fmt.Printf("i=%d ", i)
    }

    fmt.Printf("running ")
    fmt.Printf("reutrn: ")
    }

    /*
    runging
    return
    i=4
    i=3
    i=2
    i=1
    i=0
    */

    // defer, 是预先定义的,只是return时返回结果
    func testDefer3() {
    var i int = 0
    defer fmt.Printf("defer i=%d ", i)
    i = 1000
    fmt.Println("i=%d ", i)
    }

    /*
    1000
    defer i = 0
    */

      

    4、内置函数介绍

    4.1. close:

    主要⽤用来关闭channel

    4.2. len:

    用来求长度,比如string、array、slice、map、channel

    4.3. new:

    用来分配内存,主要用来分配值类型,比如int、struct。返回的是指针4.4. make:⽤用来分配内存,主要⽤用来分配引⽤用类型,⽐比如chan、map、slice

    4.5. append:

    ⽤用来追加元素到数组、slice中

    4.6. panic和recover:

    ⽤用来做错误处理理

    5、练习

    package main
    
    import "fmt"
    
    func justify(n int) bool {
    	if n <= 1 {
    		return false
    	}
    	// 质数是除了他自己,不被任何数整除
    	for i := 2; i < n; i++ {
    		if n%i == 0 {
    			return false
    		}
    	}
    
    	return true
    }
    
    // 1-100的质数
    func example1() {
    	for i := 2; i < 100; i++ {
    		if justify(i) == true {
    			fmt.Printf("[%d] is prinme
    ", i)
    		}
    	}
    }
    
    
    func is_shuixianhuashu(n int) bool {
    	first := n % 10
    	second := (n / 10) % 10
    	third := (n / 100) % 10
    
    	//fmt.Printf("first:%d second:%d third %d
    ", n , first, second, third)
    
    	sum := first*first*first + second*second*second + third*third*third
    	if sum == n {
    		return true
    	}
    	return false
    }
    
    // 水仙花束 x^3 + y^3 + z^3 = xyz
    func example2() {
    	for i := 2; i < 100; i++ {
    		if is_shuixianhuashu(i) == true {
    			fmt.Printf("[%d] is shuixianhuashu
    ", i)
    		}
    	}
    }
    
    // 统计字符串中,字符,数字,空格,其他字符的个数
    func calc(str string) (charCount int, numCount int, spaceCount int, otherCount int) {
    	// 转为字符串utf-8
    	utfChars := []rune(str)
    
    	for i := 0; i < len(utfChars); i++ {
    		if utfChars[i] >= 'a' && utfChars[i] <= 'z' || utfChars[i] >= 'A' && utfChars[i] <= 'z' {
    			charCount++
    			continue
    		}
    
    		if utfChars[i] >= '0' && utfChars[i] <= 9 {
    			numCount++
    			continue
    		}
    
    		if utfChars[i] >= ' ' {
    			numCount++
    			continue
    		}
    
    		otherCount++
    	}
    	return
    }
    
    func example3() {
    	var str string = " dfsafa d范德萨 3984234"
    	charCount, numCount, spCount, other := calc(str)
    	fmt.Printf("charCount:%d, numCount:%d, spCount:%d, other:%d", charCount, numCount, spCount, other)
    
    }
    
    func main() {
    	//example1()
    	//example2()
    	example3()
    }
    

      

  • 相关阅读:
    图片剪纸刀:批量切割图片工具
    Photosynth软件试用(将照片拼接成实景)
    制作一份简单的网络地图(世博地图的配准和切割)
    Discuz论坛地图插件(通过自定义Discuz Code实现)
    Maven Settings.xml 配置模板
    CentOS 7 firewalld 配置详解 (转)
    Silverlight学习笔记八右键菜单控件
    Silverlight学习笔记十三关于SilverLight的打印
    Silverlight学习笔记十二动态加载图片和显示提示(ToolTip)
    Silverlight学习笔记十一动态创建TabContro的TabItem
  • 原文地址:https://www.cnblogs.com/wangshuyang/p/11727945.html
Copyright © 2020-2023  润新知