Go内置函数、闭包、数组与切片

内置函数

  • close:主要用来关闭channel
  • len:用来求长度,比如string、array、slice、map、channel
  • new:用来分配内存,主要用来分配值类型,比如int、struct。返回的是指针
  • make:用来分配内存,主要用来分配引用类型,比如chan、map、slice
  • append:用来追加元素到数组、slice中
    – 如有切片
  • panic和recover:用来做错误处理,捕捉错误
func test() {

	defer func() {
		if err := recover(); err != nil {
			fmt.Println(err)
		}
	}()

	err := initConfig()
	if err != nil {
		panic(err)
	}
	return
}

闭包

  • 闭包:一个函数和与其相关的引用环境组合而成的实体
  • 例如: 函数1的返回值是函数2,则这个返回值的函数2,包括函数1里面的一些变量,整体构成一个闭包
package main

import (
	"fmt"
	"strings"
)
func makeSuffixFunc(suffix string) func(string) string {
	return func(name string) string {
		if !strings.HasSuffix(name, suffix) {
			return name + suffix
		}
		return name
	}
}
func main() {
	func1 := makeSuffixFunc(".bmp")
	func2 := makeSuffixFunc(".jpg")
	fmt.Println(func1("test"))
	fmt.Println(func2("test"))
}

数组与切片

数组

  • 数组定义:var a [len]int,比如:var a[5]int
  • 长度是数组类型的一部分,因此,var a[5] int和var a[10]int是不同的类型
  • 数组本身是值类型,赋值给另外一个数组后,改变新数组的值,旧数组是不变的

一维数组

  • 初始化
	var a [5]int = [5]int{1,2,3,4,5}
	var b = [5]int{6,7,8,9,10}
	var c = [...]int{11,12,13,14,15}
	var d =[5]int{1:5,2:10}

	fmt.Println(a)
	fmt.Println(b)
	fmt.Println(c)
	fmt.Println(d)
  • 遍历
	var a [10]int

	for _,val:=range a{
		fmt.Println(val)
	}

多维数组

  • 初始化
	var f [2][3]int = [...][3]int{{1, 2, 3}, {7, 8, 9}}
  • 遍历
	var a [3][3]int=[3][3]int{{1,2,3},{4,5,6},{7,8,9}}

	for _,v := range a {
		for _,value:=range v{
			fmt.Println(value)
		}
	}

切片

  • 用数组初始化
var a [5]int = [...]int{1,2,3,4,5}

// 第一个
var slice =a[0:1]

// 全部
slice = a[:]

// 去掉最后一个
slice = a[:len(a) - 1]
  • 用make创建切片
var slice []type = make([]type, len)
slice  := make([]type, len)
slice  := make([]type, len, cap)
  • 用append追加元素

数组

var a = []int{1,2,3}
var b = []int{4,5,6}
a = append(a, b…)

切片

var slice = make([]int, 2)

slice = append(slice,10)
slice = append(slice,10)
slice = append(slice,10)
slice = append(slice,10)
slice = append(slice,10)

会自动往后面增加容量,但是扩容之后,是新开了一段内存空间,和之前的不一样,并且是2倍增加

  • 用copy拷贝
s1 := []int{1,2,3,4,5}

s2 := make([]int, 10)

copy(s2, s1)
  • string底层就是一个byte的数组,因此,也可以进行切片操作
str := “hello world”
s1 := str[0:5]
  • 但是不可用str[0]来直接改变,本身不可变,如果要变,需要转成数组,再改(建议用rune,根据字符可变,便于处理中文)
name :="林秀贤"
tmpName :=[]rune(name)

tmpName[0] = '李'
newName :=string(tmpName)
fmt.Println(newName)

输出:
李秀贤

发布了32 篇原创文章 · 获赞 16 · 访问量 4707

猜你喜欢

转载自blog.csdn.net/weixin_44879611/article/details/104138810
今日推荐