Go语言学习笔记

##Day01 :

函数:

函数的定义:

**·**func xxx(函数名)(携带的参数)函数的返回值{

/* 函数体 */

}

eg:

func minus(a,b int , op string ) int{}

func div(c,d int)(int,int){}

func multiply(e,f int)(g,h int){}

·▶️作为函数式编程的语言,在Go语言中一个函数可以有多个返回值,在声明返回值的return语句中多个返回值中间用,隔开。

·▶️如果在定义函数返回值时不想使用某个参数,在参数位上输入_下划线即可

·🏴函数式编程规范:

func apply(func op(int , int) int , a , b int )int{

·⏫解析:在apply函数中传入的参数是op这个函数和a,b两个int类型的变量,op函数返回值是int,自带两个int类型参数。

·🛰定义一个参数列表:

func sum(numbers ...int) int{
    s :=0   for i := range numbers{
        s+= numbers[i]   
    }
    return s
}

指针:

⚡️Go语言指针没有运算,只存在值传递

指针的定义:

var a int =3

var pa *int = &a

*pa = 3

fmt.Println(*pa,pa)

▶️打印结果是:3 0xc000000a088

但是多次运行发现打印的地址都不一样,这与初始化内存空间有关。

指针值传递代码

func swap(a,s *int)(int,int){

*s,*a = *a,*s

}

func main(){

a:=3,s:=5

swap(&a,&s)

fmt.Println(a,s)

}

·☑️打印结果是:5 , 3


数组

func f(arr[5]int){

//函数体

}

·🥊数组是值类型,调用该函数相当于拷贝。可以用指针数组传值。

数组的定义:

var array1 [5] int

array2:= [3]int {1,2,3}

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

var grid [4][5] bool

数组遍历:

for i:=0;i<len(arr2);i+{

fmt.Println(arr2[i])

}

for i,r:= range arr1{ //i:下标;r:数值;

fmt.Println(i,r)

}


##Day02 :

切片:

切片的定义:
var s []int  //zero value for slice is nil

eg:

arr := [...]int{0,1,2,3,4,5,6,7}
fmt.Println("arr[2:6] =",arr[2:6])
fmt.Println("arr[:6] =",arr[:6])
s1 := arr[2:]
fmt.Println("arr[2:]", s1)
s2 := arr[:]
fmt.Println("arr[:] =", s2)

Slice本身没有数据,是对底层array的一个view,其中Slice本身有一个数据结构 :

func updateSlice(s []int){		//定义一个updateSlice函数,观察Slice的打印结果
	s[0]=100
}
fmt.Println("updateSlice s1:")
updateSlice(s1)
fmt.Println(s1)
fmt.Println(arr)

fmt.Println("updateSlice s2:")
updateSlice(s2)
fmt.Println(s2)
fmt.Println(arr)

运行结果1

可以看出,Slice不是值类型的。

ReSlice

fmt.Println("ReSlice: ")
arr[0],arr[2]=0,2		//先把元素赋值回来
s1=arr[2:6]
s2=s1[3:5]
fmt.Println(s1)
fmt.Println(s2)

运行结果2

⚠️注意:Slice可以向前扩展,不可以向后扩展,Slice底层有两个参数:len(长度)、cap(容量)

Slice底层

Slice底层

ReSlice底层

ReSlice底层

切片的使用
func printslice(s []int){
    fmt.Printf("%v,len=%d,cap=%d\n",s,len(s),cap(s))
}

🔼定义了一个用于打印切片元素信息的函数

🌳从中部删除切片中的元素:

fmt.Println("Deleting elements from slice")
s2=append(s2[:3],s2[4:]...)
printslice(s2)

🌳从切片头部删除元素:

fmt.Println("Popping from front")
front := s2[0]
s2 = s2[1:]
fmt.Println(front)
printslice(s2)

🌳从切片尾部删除元素:

fmt.Println("Popping from back")
tail := s2[len(s2) -1]
s2 = s2[:len(s2)-1]
fmt.Println(tail)
printslice(s2)

Map :

Map的创建:
m := map[string]string{
    "name": "kalyhu",
    "course": "golang",
    "site": "Bilibili",
    "quality": "notBad"
}
//mapK[V],map[K1]map[K2]V
Map的操作:

创建:make map[string]int

获取元素:m[key]

通过使用value,ok :=m[key]来判断是否存在key

fmt.Println("Getting values")
courseName , ok:= m["course"]
fmt.Println(courseName,ok)
if courseName,ok := m["couse"];ok{
    fmt.Println(courseName)
}else { 
    fmt.Println("key does not exist !")
}
fmt.Println("Deleting values")
name , ok := m["name"]
fmt.Println(name,ok)
delete(m,"name")
//由于key:name被删掉了,下面的ok将会打印出false
name , ok = m["name"]
fmt.Println(name,ok)

Map的操作

☑️遍历Map

使用range遍历key,或者遍历key,value对。但不保证遍历顺序,如要顺序需手动对key排序。


字符和字符串处理:

字符:rune (int32)、byte(uint8) 字符串:string

s := "你好,Go语言!"
fmt.Println(s)
for _,b := range []byte(s){
    fmt.Printf("%X ",b)
}
fmt.Println()
for i,ch := range s{		//ch is a rune   
    fmt.Printf("(%d,%X) ",i,ch)
}
fmt.Println()

字符串打印结果



Go

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!