Go 语言循环语句
for循环是一个循环控制结构,能够执行指定次数的循环。
for init; condition; post { }
init: 个别为赋值表达式,给控制变量赋初值;condition: 关系表达式或逻辑表达式,循环管制条件;post: 个别为赋值表达式,给控制变量增量或减量。for i:=1;i<100;i++{ fmt.Println(i)}
for range
for循环的 range 格局能够对 slice、map、数组、字符串等进行迭代循环
for key, value := range oldMap { newMap[key] = value}
求和
var sum = 0for i:=1;i<100;i++{ sum+=i}fmt.Println(sum) //4950
for省略的模式
省略模式1
sum:=0for;sum<=100;{ sum+=sum}fmt.Println(sum)
省略模式2
sum:=0for sum<=10 { sum+=sum}fmt.Println(sum)
range
str:=[]string{"躲躲","前端开发"}for i,s :=range str{ fmt.Println(i,s) //0 躲躲 1 前端开发 }numbers :=[6] int{1,2,3,4,5}for i,s :=range numbers{ fmt.Println(i,s) //0 1 1 2 2 3 3 4 4 5 5 0}numbers :=[]int{1,2,4,5}for i,s :=range numbers{ fmt.Println(i,s)}
函数
1.函数是根本的代码块,用于执行一个工作。
2.Go 语言起码有个 main() 函数。
3.你能够通过函数来划分不同性能,逻辑上每个函数执行的是指定的工作。
4.函数申明通知了编译器函数的名称,返回类型,和参数。
5.Go 语言规范库提供了多种可动用的内置的函数。例如,len() 函数能够承受不同类型参数并返回该类型的长度。如果咱们传入的是字符串则返回字符串的长度,如果传入的是数组,则返回数组中蕴含的元素个数。
函数放在main函数外面去执行
func max(num1,num2 int) int{ return num1+num2}fmt.Println(max(1,2))
返回多个参数
func strs(a,b string) (string,string){ return a,b}var a,b= strs("詹躲躲","前端开发") fmt.Println(a,b) //詹躲躲 前端开发
函数参数
传递是指在调用函数时将理论参数复制一份传递到函数中,这样在函数中如果对参数进行批改,将不会影响到理论参数。
func swap(num1,num2 int) int{ var temp int temp = num1 num1 = num2 num2 = temp return temp}ret:=swap(1,10)fmt.Println(ret) //1
援用传递
援用传递是指在调用函数时将理论参数的地址传递到函数中,那么在函数中对参数所进行的批改,将影响到理论参数。
var a int = 100var b int= 200swap(&a,&b)func swap(num1 *int,num2 *int){ var temp int temp = *num1 *num1 = *num2 *num2 = temp fmt.Println(num1) //0xc0000ac058}
// var s1,t1 = "abcd", "abcde"// var s2,t2 = "ae","aea"// ret:=findTheDifference(s1,t1)// ret1:=findTheDifference(s2,t2)// fmt.Println(ret)// fmt.Println(ret1)// }// func findTheDifference(s string, t string) byte {// return t[len(s):]// }
函数作为实参
getSqure:=func(x float64) float64{ return math.Sqrt(x) } fmt.Println(getSqure(9)) //3
申明一个函数类型
fmt.Println(math.Sqrt(9)) //3testCallBack(1,CallBack)type cb func(int) intfunc testCallBack(x int,f cb){ f(x)}func CallBack(x int) int{ fmt.Println(x) //1 return x}
变量作用域
作用域为已申明标识符所示意的常量、类型、变量、函数或包在源代码中的作用范畴。
Go 语言中变量能够在三个中央申明:
函数内定义的变量称为局部变量
函数外定义的变量称为全局变量
函数定义中的变量称为形式参数
局部变量
在函数体内申明的变量称之为局部变量,它们的作用域只在函数体内,参数和返回值变量也是局部变量。
申明局部变量
var a, b, c int
申明全局变量
var g int
Go 语言程序中全局变量与局部变量名称能够雷同,然而函数内的局部变量会被优先思考。
形式参数
形式参数会作为函数的局部变量来应用。
fmt.Println(math.Sqrt(9)) //3c:=sum(20,23)fmt.Println(c) //43func sum(x,y int)int{ fmt.Printf("sum中的变量x: %d",x) //20 fmt.Printf("sum中的变量y: %d",y) //23 return x+y}
数组
数组是具备雷同惟一类型的一组已编号且长度固定的数据项序列,这种类型能够是任意的原始类型例如整型、字符串或者自定义类型。
申明数组
var variable_name [SIZE] variable_typevar balance [10] float32fmt.Println(balance) //[0 0 0 0 0 0 0 0 0 0]
初始化数组
var balance =[5]int{1,2,4,5,7}balance:=[5]int{1,2,4,5,7} //字面量
数组推断
如果数组长度不确定,能够应用 ... 代替数组的长度,编译器会依据元素个数自行推断数组的长度
person:=[...]string{"詹","躲躲"}fmt.Println(person) //[詹 躲躲]
初始化数组中 {} 中的元素个数不能大于 [] 中的数字。
var i [10]intfmt.Println(i) //[0 0 0 0 0 0 0 0 0 0]
将索引为 1 和 3 的元素初始化
arr:=[10]string{1:"詹",3:"躲躲"}fmt.Println(arr) //[ 詹 躲躲 ]
多维数组
三维数组
var threedim [2][3][4]intfmt.Println(threedim) //[[[0 0 0 0] [0 0 0 0] [0 0 0 0]] [[0 0 0 0] [0 0 0 0] [0 0 0 0]]]arr:=[][]int{}row1:=[]int{1,2,3}row2:=[]int{4,5,6}arr = append(arr,row1)arr = append(arr,row2)fmt.Println(arr[0]) //[1,2,3]fmt.Println(arr[1]) //[4,5,6]
初始化二维数组
a:=[3][4]int{ {1,2,3,5}, {1,2,3,5}, {1,2,3,5},}fmt.Println(a) //[[1 2 3 5] [1 2 3 5] [1 2 3 5]]
数组5行2列
arr:=[5][2]int{{0,0},{1,0},{0,2},{0,2},{1,1}}var i,j intfor i=0;i<5;i++{ for j=0;j<2;j++{ fmt.Printf("数组元素arr[i][j]:%d\n",i,j,arr[i][j]) }}%!(EXTRA int=0, int=0)数组元素arr[i][j]:0%!(EXTRA int=1, int=0)数组元素arr[i][j]:1%!(EXTRA int=0, int=1)数组元素arr[i][j]:1%!(EXTRA int=1, int=0)数组元素arr[i][j]:2%!(EXTRA int=0, int=0)数组元素arr[i][j]:2%!(EXTRA int=1, int=2)数组元素arr[i][j]:3%!(EXTRA int=0, int=0)数组元素arr[i][j]:3%!(EXTRA int=1, int=2)数组元素arr[i][j]:4%!(EXTRA int=0, int=1)数组元素arr[i][j]:4%!(EXTRA int=1, int=1)
指针
Go 语言的取地址符是 &,放到一个变量前应用就会返回相应变量的内存地址
一个指针变量指向了一个值的内存地址。
var a int =20 //理论变量 var b *int //指针变量
指针变量的存储地址
b = &a fmt.Printf("指针变量的地址:%x",b) //指针变量的地址:c000016098
空指针
var ptr *int fmt.Printf("ptr 的值为 : %x\n", ptr )
语言构造体
Go 语言中数组能够存储同一类型的数据,但在构造体中咱们能够为不同项定义不同的数据类型。
构造体是由一系列具备雷同类型或不同类型的数据形成的数据汇合。
定义构造体
构造体定义须要应用 type 和 struct 语句。struct 语句定义一个新的数据类型,构造体中有一个或多个成员。type 语句设定了构造体的名称。
type Person struct{ name string age int sex string id string}fmt.Println(Person{"詹躲躲",19,"男","2133321321"}) //{詹躲躲 19 男 2133321321}fmt.Println(Person{name:"詹躲躲",age:19,sex:"男",id:"2133321321"}) //{詹躲躲 19 男 2133321321}
疏忽字段
fmt.Println(Person{name:"詹躲躲",age:19}) //{詹躲躲 19}
拜访构造体成员
type Person struct{ name string age int sex string id string}
var person Personperson.name = "许嵩"fmt.Println(person) //{许嵩 0 }
构造体作为函数参数
var person1 Personperson1.name = "许巍"var person2 Personperson2.name="赵雷"printStruct(person1) //构造体的数据:许巍printStruct(person2) //构造体的数据:赵雷
type Person struct{ name string age int sex string id string}func printStruct(person Person){ fmt.Printf("构造体的数据:%s",person.name) }
构造体指针
var person1 Personperson1.name = "许巍"var person2 Personperson2.name="赵雷"printStruct(&person1) //构造体的数据:许巍printStruct(&person2) //构造体的数据:赵雷type Person struct{ name string age int sex string id string}func printStruct(person *Person){ fmt.Printf("构造体的数据:%s",person.name) }
语言切片
切片是对数组的形象。
切片初始化
a:=[]int{1,2,3} //[1 2 3]b:=a[:] //[1 2 3]fmt.Println(a,b)
应用make
a:=make([]int,3,5)fmt.Println(a) //[0 0 0]len() 办法获取长度cap() 能够测量切片最长能够达到多少a:=[8]int{1,2,3,4,5,6,7,8}fmt.Println(len(a),cap(a)) //8 8
空的切片
var a []intif(a==nil){ fmt.Println("空的切片")}
切片截取
a:=[8]int{1,2,3,4,5,6,7,8}fmt.Println("原始大小",a) //[1,2,3,4,5,6,7,8]fmt.Println("1-4(不蕴含4)",a[1:4]) //2,3,4fmt.Println("0-4(不蕴含4)",a[:4]) //[1,2,3,4]fmt.Println("4当前的",a[4:]) //5,6,7,8append() copy() 函数var numbers []intnumbers = append(numbers,1)numbers1:=make([]int,len(numbers),(cap(numbers))*2)copy(numbers1,numbers)fmt.Println(numbers) //[1]
范畴(Range)
a:=[5]int{1,2,3,4,5}for i,j :=range a{ fmt.Println(i,j) //0 1 1 2 2 3 3 4 4 5}
枚举字符串
for i,j :=range "asdsada"{ fmt.Println(i,j) //0 97 1 115 2 100 3 115 4 97 5 100 6 97}range也能够用来枚举Unicode字符串。第一个参数是字符的索引,第二个是字符(Unicode的值)自身
元气满满的一天。今天持续打卡,持续开启GO之旅。