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)
可以看出,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)
⚠️注意:Slice可以向前扩展,不可以向后扩展,Slice底层有两个参数:len(长度)、cap(容量)
Slice底层
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
使用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()
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!