安装go语言
- 下载golang
配置环境变量
不配置也没有什么大的影响,只是不方便编译罢了
Windows
- 我的电脑——右键属性——高级系统设置——环境变量——系统变量
- GOROOT:Go安装路径
- GOPATH:Go工程路径,如果有多个按分号间隔
- Path:在Path中添加: C:\Go\bin;%GOPATH%\bin;。我的Go安装在C盘中。
- cmd中使用 go env(查看得到Go的配置信息) 或者 go version(查看go的版本号) 检查环境配置成功与否
Mac
- 双击下载的pkg包,默认安装就行了
- 编辑用户目录中的 .bash_profile 文件
- sudo vim .bash_profile
- 添加一下内容
export GOPATH=/Users/admin/Desktop/Go_project #为你go语言的工程目录
export GOROOT=/Usr/local/go
export GOBIN=$GOROOT/bin
export PATH=$PATH:$GOBIN
下载使用 Goland
自行百度咯
HelloWorld
package main
import "fmt"
func main() {
fmt.Println("HelloWorld")
//没有分号
}
-
package main定义了包名
- 必须在源文件中非注释的第一行指明这个文件属于的包
- package main表示可以独立运行的执行程序
-
import “fmt” 告诉Go编译器导入fmt包,fmt包实现格式化IO
-
func main() 程序入口,每个可执行程序必须包含
- 一般来说第一个执行的就是main函数
- 如果有init函数,则优先执行init函数
-
如果打算将多个语句在写统一行,则必须使用 分号’;’,反正不鼓励这种写法
-
命令行中使用 go run 01_HelloWorld.go 命令,执行文件
-
命令行中使用 go build 01_HelloWorld.go 命令,编译出 01_HelloWorld 文件,再运行该文件
Goland快捷方式
- ALT+Q:看当前方法的声明
- CTRL+Backspace:按单词进行删除
- SHIFT+ENTER:向下插入新行
- CTRL+X:删除当前光标所在行
- CTRL+D:复制当前光标所在行
- ALT+SHIFT+UP/DOWN:光标所在代码行,整行上移或下移
- CTRL+SHIFT+U:选中内容进行大小写转换
- CTRL+ALT+L:自动排版
Go规则
-
Go语言中,使用大小写来决定标志符(常量,变量,类型,接口,结构或函数)是否可以被外部包所调用
- 以一个大写字母开头,那么使用这种形式的标志服的对象就可以被外部包的代码所使用,类似C++中的public
- 以一个小写子母开头,则对包外是不可见的,但是他们在整个包的内部是可见的,像C++中的private
-
常用关键字
- 程序组成
- 当前程序的包名 : package main
- 导入其他包 : import “fmt”
- 常量定义 : const PI=“3.14” (习惯性全大写)
- 全局变量的声明和赋值 : var name=“gopher”
- 一般类型声明 : type newType int
- 结构的声明 : type gopher struct{}
- 接口的声明 : type golang interface {}
- 文件的结构组成
1.
- 只有package 名称为main 的包可以包含main函数
- 一个可执行程序有且只有一个mian包
- 通过import关键字导入其他非main包
- 可以通过import关键字单个导入,也可以多个导入
2. 一般由关键字,常量,变量,运算符,类型和函数组成
3. 分隔符:括号(),中括号[],大括号{}
4. 各种标点符号
5. 使用var关键字来进行全局变量的声明和赋值
6. 通过type关键字来进行结构体和接口声明
7. func关键字进行函数声明
变量
-
为初始化的标格式
- var 变量名 变量类型
-
为初始化的批量格式
var (
a int
b string
c []float32
d func() bool
e struct{
x int
y string
}
)
整形和浮点型变量默认值:0
bool型默认值是 false
字符串默认值为空字符串
函数,指针变量初始值为nil
- 初始值变量的标准格式
var (
a int = 100
)
- 初始化变量的编译器自动推断类型格式
var (
l = 200
)
- 短变量声明格式
- 只能被用在函数体内,不能被用于全局变量的声明与赋值
- 该变量名必须是没有定义过的变量
- 首选的局部变量的名字
m := 100
fmt.Printf("HelloWorld %T %d", m, m) //没有分号
- 多个变量同时赋值
m, n, g := "a", "b", 10
x, y int
- 匿名变量
- 使用‘_’替换没有使用到的变量,不会占用命名空间,不会分配内存
- go语言函数返回与python相似,可以返回多个变量,同时 = 也可以给多个变量赋值
x := 10
y := 20
fmt.Println(x, y)
x, y = y, x
fmt.Println(x, y)
可以看到x,y的值交换了
数据类型
- 基本数据类型:整形,浮点型,布尔型,字符串,字符(byte,rune)
- 复合数据类型:指针,数组,切片,映射,函数,结构体,通道
整形
- int8, int16, int32, int64, int
- unit8, uint16, uint32, uint64, uint
- byte一般用于存放ascii表中的数据
- rune一般用于存放Unicode中的数据
uint8即使byte型,int16对应C语言的short型,int64对应C语言的long型
符号 | 数据范围 |
---|---|
uint8 | 2的8次方 |
uint16 | 2的16次方 |
uint32 | 2的32次方 |
uint64 | 2的64次方 |
int8 | -128~127 |
int16 | -32768~32767 |
int32 | -2147483648~2147483647 |
int64 | -9223372036854775808~9223372036854775807 |
byte | 类似uint8 |
rune | 类似int32 |
uint | 32或者64位,根据机器字长决定 |
int | 与uint一样 |
uintptr | 无符号整形,正与存放一个指针 |
func main(){
a := 100
var b byte = 100
var c rune = 200
var e byte = 'a'
var f rune = '一'
fmt.Printf("%T %v\n", b, b);
fmt.Printf("%T %v\n", c, c);
fmt.Printf("%T %v\n", e, e);
fmt.Printf("%T %v\n", f, f);
}
bool型
- 声明方式:var flag bool
- 不参与运算,也无法与其他类型进行转换
字符串
- 字符串可以使用转义符
- ‘\r’:回车符
- ‘\n’:换行符
- ‘\t’:制表符
- ':单引号
- ‘’:双引号
- \:反斜杠
- 多行定义字符串
- 双引号书写字符串被成为字符串字面量(string literal)。不能跨行
- 多行字符串需要使用 ”`“反引号,多用于内嵌源码和内嵌数据
- 在反引号中的所有代码都不会被编译器识别,而只是作为字符串的一部分
arr := []byte{97, 98, 99, 65}
code := `type a int
m := 19
b = "string"
h = 100
fmt.Printf("HelloWorld %T %d", m, m) //没有分号
`
fmt.Println(code)
字符型
- 字符串中的每一个元素都是一个 字符,定义字符使用单引号
- byte一般用于存放ascii表中的数据
- rune一般用于存放Unicode中的数据
var e byte = 'a'
var f rune = '一'
格式化输出
-
通用
- %v :值的默认格式表示
- %+v :类似%v,但输出结构体时会添加字段名
- %#v :值的Go语法比噢哈斯
- %T :值的类型的Go语法表示
-
bool型
- %t :单词true或false
-
整数
- %b : 表示二进制
- %c : 该值对应的unicode码值
- %d : 表示为十进制
- %8d: 表示该整型长度是8,不足8则在数值前补空格,超过8则以实际为准不做修改
- %08d:数字长度是8,不足8位的在数字前补0,超过8不做修改
- %o : 表示位八进制
- %q : 该值对应的单引号扩起来的go语法字符字面值,必须时会采用安全的转义表示
- %x : 表示为十六进制,使用a-f
- %X : 表示为十六进制,使用A-F
- %U : 表示为Unicode格式:U+1234
-
浮点数和复数的两个组分
- %b : 无小数部分,二进制指数的科学计数法,如 -123456p-78
- %e :(=%.6e)有6位小数部分的科学计数法,如-1234.456e+78
- %E : 科学计数法,如-1234.456E+78
- %f :(=%.6f)有6位小数部分,如123.456123
- %F : 等价于%f
- %g : 根据实际情况采用 %e 或%f格式
- %G : 根据实际情况采用 %E 或%F格式
-
字符串和 []byte
- %s : 直接输出字符串或者 []byte
- %q : 该值对应的双引号扩起来的go语法字符串字面值
- %x : 每个字节使用两字符十六进制表示(使用a-f)
- %X : 每个字节使用两字符十六进制表示(使用A-F)
fmt中不仅有 print 等方法格式化输出到控制台,更能将格式化输出的值作为返回值返回成字符串类型
var str := fmt.Sprintf("%b", 123)
数据转换
go语言真的很严格,进行运算的变量必须是统一类型的变量
- T(表达式)
- 采用数据类型前置括号的方式进行类型转换。T表示要转化的类型,表达式包括变量,数值,函数返回值等
- 类型转换时,需要考虑两种类型之间的关系和范围,是否会发生数值截断
- 布尔类型无法与其他类类型转换
ch := 90
en := 80.9
avg := (ch + int(en))/2
avg2 := (float64(ch) + en)/2.0
fmt.Println(avg)
fmt.Println(avg2)
- floag与int之间的转换
需要注意float转int时精度的损失
ch := 90
res := string(ch)
fmt.Println(res) // 输出 Z 就是 90对应的ASCII
-
int转string
- 其实相当于byte或rune转string
- 该int数值是ASCII码的编号或Unicode字符集的编号。转成string就是将根据字符集,将对应编号的字符查出来
- 当该数值超出Unicode编号范围,则转成的字符串显示成乱码
-
不允许string转int
常量
声明方式
- 常量恒定不变,不能修改
- 常量中的数据类型只可以是bool型,数值型和字符串
- 常量的定义格式:
- const 标识符 [类型] = 值
- 可以省略类型说明符[类型],
- 多个相同的类型可以写成 cosnt WIDTH, HEIGHT = 1, 2
- 常量定义后未被使用,编译不会报错
常量用于枚举(常量组)
const (
Unkown = 0
Female = 1
Male = 2
)
- 常量组中如果不指定类型和初始值,则与上一行非空常量的值相同
const (
a = 10
b
c
)
// a = 10 b = 10 c = 10
iota
- iota,特殊常量值,是一个系统定义的可以被编译器修改的常量值。iota只能出现在常量组中。
- 在每一个const关键字出现时,被重制为0,然后每出现一个常量,iota所代表的数值会自动增加1。iota可以理解成常量中常量的计数器,不论该常量的值是什么,只要有一个常量,那么iota就+1
- iota可以被用作枚举值
const (
X = "A"
Y
)
const (
a = iota
b = iota
c = iota
)
// a = 0 b = 1 c = 2
const (
A = "Test"
B = iota
C
)
// a = "Test" b = 1 c = 2
Go语法
条件分支
if…else…
//1
if 布尔表达式{
}
//2
if 布尔表达式 {
} else {
}
//3
if 布尔表达式 {
} else if 布尔表达式 {
} else {
}
num := 89
if num%2 == 1{
fmt.Println("奇数");
}
- 布尔表达式不是必须使用括号扩起来
- 必须使用大括号 {},即使只有一行代码
- 左括号必须与 if 或 else 同行
- 在if之后,条件语句之前,可以添加变量初始化语句,使用 ;进行分隔
switch
switch var1 {
case var1:
...
case var2:
...
case var3:
...
default:
...
}
- switch从上至下,找到匹配到的那一项为止,无需额外添加berak
- var1可以是任何类型,而var1和var2则可以是任何同类型的任意值
- 可以同时测试多个符合条件的值,使用逗号分割:case var1,var2,var3
- Go语言中switch后的表达式可以省略,默认是true
- case后的值不能重复
- 因为默认匹配到case 就break,所以如果不想break掉则需要添加fallthrough(贯穿),强制执行后面的case分支
- fallthrough必须放在case分支的最后一行
func init(){
month := 2
days := 0
switch month {
case 1, 3, 5, 7, 8, 10, 12
days = 31
fallthrough //会执行下一个case,然后在下一个case break掉
case 4, 6, 9, 11:
days = 30
case 2:
days = 28
default = -1
}
}
循环
go语言中没有while也没有do…while…