1.1变量的定义和赋值
package main import( "fmt" ) //集中定义变量 var ( aa = 2 bb = true cc = "jack" ) func variableZeroValue(){ //定义变量不赋值会有一个默认的初始值 var a int var s string fmt.Printf("%d %q ",a,s) //格式化输出 } func variableShorter(){ //用冒号 d,e,f := 5,false,"zhang" fmt.Println(d,e,f) //定义的变量不使用会报错 } func main() { fmt.Println("helloworld") variableZeroValue() //a,s初始值:0 "" }
三种方法定义 var定义名后面加类型:var a int=1,让编译器自动选择类型:var a,b=1,"aa",使用冒号定义:a,b := 1,"aa"。
1.2数据类型以及枚举和常量
数字类型:(u)int8,int32,int64,float32,float64,complex64,complex128.....
字符串:byte,rune,uintptr(用于存放指针)
常量的定义:
package main import( "fmt" ) func main() { //不指定类型,则可以作为各种类型使用 const a,b = 3,4 //指定为string类型,则为指定的类型 const str string = "derek" const ( java = iota //iota自增值枚举类型 python golang javascript ) fmt.Println(java,python,golang,javascript) //0 1 2 3 fmt.Println(a,b,str) //3 4 derek }
1.3条件语句
if不需要加括号且里可以赋值:
package main import( "fmt" "io/ioutil" ) func main() { const filename = "C:\Users\86158\Desktop\awesomeProject\src\abc.txt" //ioutil.ReadFile:返回两个值,一是读出内容,二是error信息 //if的条件里可以赋值 if contents,err := ioutil.ReadFile(filename); err != nil{ fmt.Println(err) }else { fmt.Printf("%s ",contents) } //if条件里赋值变量的作用域就在if语句里,外面访问报错 }
switch不需要break自动跳出,语句后可以没有表达式:
package main import( "fmt" ) //string是返回值类型 func grade(score int) string{ g := "" switch { case score < 0 || score > 100: //报错信息 panic(fmt.Sprintf("错误的分数:%d",score)) case score < 60: g = "D" case score < 80: g = "C" case score < 90: g = "B" case score <= 100: g = "A" } return g } func main() { fmt.Println(grade(2)) fmt.Println(grade(101)) //panic: 错误的分数:101 }
for语句条件里不需要括号,可省略初始条件,结束条件,递增表达式:
package main import "fmt" func main() { sum := 0 for i :=1; i <= 100; i++{ sum += i } for { //不写条件就是死循环,没有while fmt.Println(sum) } fmt.Println(sum) }
1.4函数
函数返回值写在最后并且可以有多个,函数也可以作为参数:
package main import "fmt" //返回两个值 func div(a,b int) (q,r int){ return a / b, a % b } func main() { q,r := div(13,3) //如果只想接收一个返回值,可以用“_” q,_ := div(13,3) fmt.Println(q,r) //4 1 }
1.5指针
指针也是一个变量,它存储的数据是另一个变量的内存地址,自身也有一个内存地址。
值传递是将实际参数复制一份到函数中,引用传递(slice,map,channel,inrerface,fun())是将实际参数的地址传递到函数中,c++例子:
#include <stdio.h> void pa_by_val(int a){ a++; } void pa_by_ref(int& a){ a++; } int main(){ int a = 3; pa_by_val(a); printf("After pa_by_val: %d ", a); // 值传递 3 pa_by_ref(a); printf("After pa_by_ref: %d ", a); // 引用传递 4 }
引用传递指针参数传递到函数内,引用传递例子:
package main import "fmt" func main() { a, b := 100, 200 /* 调用 swap() * &a指向a指针,a变量地址 * &b指向b指针,b变量地址 */ swap(&a, &b) fmt.Println(a,b) /* 200 100 */ } func swap(x , y *int) { *x,*y = *y,*x }
指针操作&:取地址,*:根据地址取值,用法:
package main import "fmt" func main() { var a int = 2 var pa *int = &a *pa = 3 fmt.Println(a) //3 }