• 四月二十八号日报


    今日学习内容

    Go语言函数

    1.1介绍:Go里面有三种类型的函数:

    • 普通的带有名字的函数
    • 匿名函数或者lambda函数
    • 方法

    函数可以将其他函数调用作为它的参数,只要这个被调用函数的返回值个数、返回值类型和返回值的顺序与调用函数所需求的实参是一致的。在Go语言中不支持函数的重载(原因是函数重载需要进行多余的类型匹配影响性能)

    1.2函数参数与返回值:相比于C/C++、Java等多返回值是Go的一大特性

    1.2.1按值传递与按引用传递:Go 默认使用按值传递来传递参数,也就是传递参数的副本。如果你希望函数可以直接修改参数的值,而不是对参数的副本进行操作,你需要将参数的地址(变量名前面添加&符号,比如 &variable)传递给函数,这就是按引用传递,比如 Function(&arg1),此时传递给函数的是一个指针。

    1.2.2命名返回值:如果命名了返回值参数,一个没有参数的return语句,会将当前的值作为返回值返回。

    package main
    import "fmt"
    func split(sum int) (x, y int) {
        x = sum * 4 / 9
        y = sum - x
        return
    }
    
    func main() {
        fmt.Println(split(17))
    }
    

    尽量使用命名返回值:会使代码更清晰、更简短,同时更加容易读懂。

    1.2.3空白符_用来匹配一些不需要的值,然后丢弃掉

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	var i1 int
    	var f1 float32
    	i1, _, f1 = ThreeValues()
    	fmt.Printf("The int: %d, the float: %f 
    ", i1, f1)
    }
    
    func ThreeValues() (int, int, float32) {
    	return 5, 6, 7.5
    }
    

    1.3传递变长参数:如果函数的最后一个参数是采用 ...type 的形式,那么这个函数就可以处理一个变长的参数,这个长度可以为 0,这样的函数称为变参函数。

    package main
    
    import "fmt"
    
    func main() {
    	x := min(1, 3, 2, 0)
    	fmt.Printf("The minimum is: %d
    ", x)
    	arr := []int{7, 9, 3, 5, 1}
    	x = min(arr...)
    	fmt.Printf("The minimum in the array arr is: %d", x)
    }
    
    func min(a ...int) int {
    	if len(a) == 0 {
    		return 0
    	}
    	min := a[0]
    	for _, v := range a {
    		if v < min {
    			min = v
    		}
    	}
    	return min
    }
    

    1.4defer和追踪:关键字 defer 允许我们推迟到函数返回之前一刻才执行某个语句或函数关键字 defer的用法类似于面向对象编程语言 Java 和 C# 的 finally 语句块,它一般用于释放某些已分配的资源。

    package main
    
    import "fmt"
    
    func main() {
    	function1()
    }
    func function1() {
    	fmt.Printf("In function1 at the top
    ")
    	function2()
    	fmt.Printf("In function1 at the bottom!
    ")
    }
    
    func function2() {
    	fmt.Printf("function2: Deferred until the end of the calling function!
    ")
    }
    

    1.5递归函数:当一个函数在其函数体内调用自身,则称之为递归。

    package main
    import "fmt"
    
    func main() {
    	fmt.Print(pr(5))
    }
    
    func pr(n int) int {
    	if n == 1 {
    		return 1
    	} else {
    		return n * pr(n-1)
    	}
    }
    

    1.6将函数作为参数:函数可以作为其它函数的参数进行传递,然后在其它函数内调用执行,一般称之为回调。

    package main
    
    import "fmt"
    
    func main() {
    	callback(1, Add)
    }
    
    func Add(a, b int) {
    	fmt.Printf("The sum of %d and %d is: %d
    ", a, b, a+b)
    }
    
    func callback(y int, f func(int, int)) {
    	f(y, 2)
    }
    
    

    1.7闭包:当我们不希望给函数起名字的时候,可以使用匿名函数,这样的一个函数不能够独立存在但可以被赋值于某个变量,即保存函数的地址到变量中然后通过变量名对函数进行调用。

    package main
    
    import "fmt"
    
    func main() {
    	func() {
    		fmt.Print("hello world")
    	}()
    }
    

    1.8应用闭包:将函数作为返回值:下面两个函数均是返回一个闭包,然后调用她

    package main
    
    import "fmt"
    
    func main() {
    	// make an Add2 function, give it a name p2, and call it:
    	p2 := Add2()
    	fmt.Printf("Call Add2 for 3 gives: %v
    ", p2(3))
    	// make a special Adder function, a gets value 3:
    	TwoAdder := Adder(2)
    	fmt.Printf("The result is: %v
    ", TwoAdder(3))
    }
    
    func Add2() func(b int) int {
    	return func(b int) int {
    		return b + 2
    	}
    }
    
    func Adder(a int) func(b int) int {
    	return func(b int) int {
    		return a + b
    	}
    }
    

    Linux文件与目录管理

    2.1headtail命令:这是对数据做一个简单的提取功能,就是取出前面与取出后面文字的功能

    • head [-n number] 文件-n后面接数字代表几行的意思

    2.2od命令:我们可以用od这个命令来读取非纯文本文件内容

    • od [-t TYPE] 文件

    2.3touch命令:修改文件时间或创建新文件

    ​ linux下有许多时间参数,主要是三个:

    • mtime文件数据内容更改时间
    • ctime文件状态更改时间,比如权限属性等
    • atime文件内容被取用时的时间,比如使用cat命令时

    所以touch主要用来新建一个空的文件和将文件日期修订为目前日期(mtime,atime)

    2.4文件的默认权限与隐藏权限

    2.4.1文件默认权限:umask:目前用户在建立文件或目录时候的默认权限值

    • 新建文件时的权限:rw-r--r--
    • 新建目录时的权限:rwxr-xr-x

    如果需要更改默认权限值则用命令umask+三个数字(root的umask默认是022)

    2.4.2文件隐藏属性chattr,lsattr(显示文件隐藏属性)

    • chattr [+-=][ASacdistu]文件目录或名称 (其中有几个重要的参数讲解,如下)
    • +:增加某一个特殊的参数,其它原本存在的参数不懂
    • -:删除某一个特殊的参数,其它原本存在的参数不懂
    • =:仅有后面接的参数
    • a:当设置a后,这个文件只能增加数据,而不能删除也不能修改数据,只有root才能设置这个属性
    • i:让一个文件不能被删除,改名,设置连接也无法写入或添加数据,只有root能设置此属性
  • 相关阅读:
    [leetcode] 17. 电话号码的字母组合
    C++17 Fold Expressions
    多线程----NSOperation
    CGD---1--开辟并发新线程
    彻底解决_OBJC_CLASS_$_某文件名", referenced from:问题(转)
    ios 内存使用陷阱 和imageNamed 、imageWithContentsOfFile:(转)
    (转)unbalanced calls to begin/end appearance transitions for uiviewcontroller的解决方法
    ios开发种证书
    使用CAShapeLayer与UIBezierPath画出想要的图形
    定位子字符串的位置
  • 原文地址:https://www.cnblogs.com/swtczb/p/11632632.html
Copyright © 2020-2023  润新知