https://golang.google.cn/dl/
1、安装 我安装在了D:\Go
添加 D:\GoWork 目录,并在目录下增加src,此目录为写代码目录
2、配置环境变量
path中添加以下内容
3、重启电脑,打开 cmd 输入: go version可以查看安装的版本
4、安装vscode ,并添加Chinese和Go两个插件
5、添加代码提示
cmd中执行以下语句:
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.io,direct
执行完后,vscode中右下角点击install all
5、编写helloworld
在D:\GoWork\src目录下添加main.go文件,并写入以下代码
package main import "fmt" func main (){ fmt.Println("hello world!") }
编译代码(会生成main.exe文件):go build main.go
执行编译后的exe文件:./main.exe
1、main包为应用程序的入口包
2、包名可以与其目录不同名
3、一个目录下的同级文件归属一个包。
为go语言中具有含义的字,不可作为变量名使用
声明方式为:var 变量名 变量类型
需要注意的是,函数内变量一旦声明,必须使用
1、变量声明
var name string //默认为"" var age int //默认为0 var isOk bool //默认为false //变量赋值 name = "小明" age = 1 isOk = true
2、多变量声明
当多变量声明时,第一个有值,以下的没有值,自动使用第一个的值
var ( name string age int isOk bool ) //以下所有的值都为1,都使用了name的值 const ( name int = 1 age isOk )
3、简短变量赋值 自动判断类型
name := "aaa"
4、匿名变量 _ ,如果不需要该值则直接使用下划线代替,占位使用
5、、常量
程序运行中数据不再改变,定义之后,不能再次赋值了
const status = 1
6、 iota常量计数器(只能在常量中使用)
当iota关键字出现时,该值会被重置为0,每新增一行常量将会被计数一次
下方代码中三个值从上到下分别为0,1,2
const ( name int = iota age isOk )
1、 整形分为两类,有符号类型(int)和无符号类型(uint),可以理解为uint8就是byte类型,uint16就是short类型,uint64就是long类型
2、特殊类型
主要区别于放在32或者64位系统会占用的数量
只支持flout32和flout64,默认flout定义都是flout64
amount float64 = 1.3
flout32和flout64这两个类型都不能转换
bool,和java中的boolean一致,判断true和false
var age = 17; fmt.Printf("%T\n", age) //查看类型 fmt.Printf("%v\n", age) //查看值 fmt.Printf("%#v\n", age) //查看值,并加上类型标识 fmt.Printf("%b\n", age) //查看二进制 fmt.Printf("%d\n", age) //查看十进制 fmt.Printf("%o\n", age) //查看八进制 fmt.Printf("%x\n", age) //查看十六进制 var name = "123"; fmt.Printf("%s\n", name) //查看字符串
string也是原生类型,内部实现使用的是utf-8,string只能用双引号包裹,单引号包裹的是字符
str := "123" 普通字符串
str := `啊啊啊` 可换行的字符串
1、常用操作
split举例:
str := "123" arr := strings.Split(str,"2") fmt.Println(arr)
2、字符串分为两种类型
1、byte类型,表示ASCII中的字符
2、rune类型,表示一个UTF-8的字符
3、字符串修改
字符串类型本身不能修改,需要先将字符串转换为rune类型,修改完字符后,再将转换为string类型才可以
str := "白萝卜" str1 := []rune(str) str1[0] = '红' //需要是单引号 因为rune是字符 fmt.Println(string(str1))
age := 19 if(age <= 10){ fmt.Println("小于10") }else if(age >10 && age <=19){ fmt.Println("大于10并小于19") }else{ fmt.Println("大于等于19") }
1、for循环
for i := 0; i < 19; i++ { fmt.Println(i) }
2、无限循环
for { fmt.Println('i') }
3、range循环 ,i是角标,v是rune类型的值
str := "哈哈哈" for i,v := range str { fmt.Println(i,v,string(v)) }
1、声明数组长度 :arr := [3]string{"你好","你好2","你好3"}
2、不声明数组长度:arr := [...]string{"你好","你好2","你好3"}
3、多维数组:
//一个数组包含3个子数组,子数组两个值 arr := [3][2]string{ [2]string{"第一个数组","第一个数组"}, [2]string{"第二个数组","第二个数组"}, [2]string{"第三个数组","第三个数组"}, } // for i, v := range arr { for i1 := 0; i1 < len(v); i1++ { v1 := v[i1] fmt.Println(i1,v1) } fmt.Println(i,v) }
切片是拥有相同元素类型的可变长度的序列,是基于数组的封装,支持自动扩容
切片是一个引用类型,内部包含地址,长度,容量。一般用于操作集合
1、定义: var arr = []int{1,2,3}
2、判断是否为空:arr == nil
3、查看长度和容量:len(arr),cap(arr)
4、对slice进行切割:
1角标后的数据:arr1 = arr[1:]
2角标前的数据:arr1 = arr[:2]