一、环境安装
1、安装Go环境
1、官网下载
2、cmd-->go version
3、环境变量
GOROOT:go安装路径
GOPATH:go存放代码的路径
4、GOWorks新建三个文件
5、go env查看配置
2、安装编辑器
GoLand或者VSCode
3、HelloWorld
package main //一个程序只有一个main包
import "fmt"
func main(){
fmt.Println("Hello World!")
}
运行:
go run 文件名.go
4、Go命令
修改环境值:go env -w 字段=""
二、基础语法
1、注释
单行注释 //
多行注释/**/
2、变量定义
package main import "fmt" func main(){ var name string ="zhangdan" var age int=18 //定义多个值 var( name string//默认值 空 age int//默认值 0 ) var a,b,c int fmt.Println(name) }
package main import "fmt" func main(){ // := 自动推导 name := "zhangsan" var age int age=18 //%T表示打印类型 fmt.Println("%T",name) //%p 表示打印地址 fmt.Println("age:%d,内存地址:%p",age,&age) age=20 //地址不会变 }
变量交换
package main func main(){ var a int=100 var b int =200 //交换a,b的值 b,a=a,b }
3、匿名变量
_ 空白标识符,任何赋给这个标识符的值将被抛弃
package main import "fmt" func test()(int ,int){ return 100,200 } func main(){ a,_:=test() _,b:=test() fmt.Println(a,b) } //匿名变量不占用内存空间,不会分配内存
4、常量const
package main func main(){ //不能被修改,相当于final const URL string ="www.baidu.com"//显式定义 const URL2="www.google.com"//隐式定义 const a,b,c=3.14,"abc",false//同时定义多个 }
iota 常量计数器
func main(){ const( a=iota //0 b //1 c //2 d="hahh" //hahh e //hahh f=100 //100 g //100 h=iota //7 i //8 ) }
5、基本数据类型
布尔、数值、字符串
//布尔型 false %t var isFlag bool fmt.Printf("%T,%t\n",isFlag,isFlag) // 数值型 整形 0 %d uint8 0~255 别名byte uint16 rune uint32 uint64 int8 -127~128 int16 int32 int64 int //数值型 浮点型 0.0 %f 默认6位小数,%.2f 保留两位小数 float32 IEEE-754 32位浮点数 float64 IEEE-754 64位浮点数 complex64 32位实数和虚数 complex128 64位实数和虚数 //字符串 string 空 %s 双引号 单引号会转为ASCⅡ编码表,unicode编码表,全世界文字,gbk全中国 转义字符 \
类型转换
a:=3 //int b:=5.0 //float64 //将int类型的a转换为float64类型 c:=float64(a)
整形不能转为布尔
6、运算符
算术运算符
+、-、*、/、%、++(自增)、--
关系运算符
==、>、<、>=、<=、!=
逻辑运算符
&& 、||、!
位运算符
& 位与,都是1,结果位1
| 位或,都是0,结果为0
^ 位异或,不同为1
&^ 位清空,a&^b,对于b上数值,如果为0,则取a对应位数值,为1,取0
<< 左移,高位丢弃,低位补0,乘以2的n次方
>> 右移,地位丢弃,高位补0,除以2的n次方
7、基础阶段键盘输入
package main func main(){ var x int var y float64 fmt.Println("请输入一个整数,一个浮点数:") fmt.Scanln(&x,&y) fmt.Printf("x:%d,y:%f",x,y) }
8、流程控制
选择结构
func main(){ var a int =15 if a>0&&a<10{ fmt.Println("A") }else if a>=10&& a<90{ fmt.Println("B") }else{ fmt.Println("C") } }
var a int=90 switch a{ case 90: fmt.Println("A") case 80: fmt.Println("B") case 50,60,70: fmt.Println("C") default: fmt.Println("D") } switch默认匹配成功后不会执行其他case,如果需要执行其他case,可以使用fallthrough穿透case,break结束穿透
循环结构
func main(){ for i:=1;i<10;i++{ fmt.Println(i) } }
break结束循环
continue结束当次循环
9、String
str:="hello" //获取长度 len(str) //获取指定字节 fmt.Pirntln(str[0])//104 fmt.Printf("%c",str[0])//h //字符串是一个个字符拼接而成 //for range循环 循环遍历数组、切片.... for i,v :=range str{ fmt.Print(i) //下标 fmt.Printf("%c",v)//值 }
三、函数
1、定义
func funcName(param paramType)(returnType){
}
2、可变参数
func main(){ sum:=getSum(1,2,3,4) } func getSum(nums...int)(int){ sum:=0 for i:=0;i<len(nums);i++{ sum+=nums[i] } return sum } /* 注意: 可变参数要放在列表最后 一个函数参数列表中最多一个可变参数 */
3、值传递与引用传递
值传递:传递的是数据的副本,修改数据对原数据没影响
基础类型、array、struct...
引用传递:传递的是地址,修改数据对原数据有影响
切片:可以扩容的数据
map、chan...
4、defer
defer会将函数延迟到最后执行,多条defer入栈执行。
5、函数的数据类型
func() 本身就是一个数据类型
func main(){ fmt.Printf("%T",f1) //func(int int) var f2 func(int,int) f2=f1 f2(1,2) } func f1(a,b int){}