Title

go基础知识一

1.Go语言简介

go诞生于 2009年,天然支持并发,很新,但是生态不完善。

Go是静态 强类型语言,是区别于解析型语言的编译型语言。 -编译后执行---》编译成可执行文件 (java编译成字节码--运行在jvm上,每台机器都要跑一个jvm,300m内存) -解释型:直接运行在解释器上,php,js,python -跨平台性如何?

java:一处编码,处处运行,go:跨平台编译(交叉编译),可以在windows平台编译出linux下的可执行文件 -在linux上装过python,源码包下载,解压,make && make install gcc编译的,当前平台的可以执行文件 -go写的程序,只需要跨平台编译完,拿到不同平台上,不需要安装任何依赖

-强类型:go,python是强类型,不允许不同类型运算 'aa'+1 报错 -弱类型:允许不同类型运算

有垃圾回收的机制(gc)

支持面向对象和面向过程的编程模式(go不是一个纯粹的面向对象语言,面向对象的特性它都有:继承,封装,多态)

2009年推出 12年稳点版本 1.5——实现的架构变化,同时保留了和旧版本的兼容性,以后的go,完全实现了go自己写的

2.Go语言的开发环境搭建

# go开发包(类似于python解释器)+ ide(golang,vscode,sublime text。。。。)
# golang:跟pycharm 90%相似,jetbrains公司,idea,用来开发java的,phpstorm,pycharm,goland
开发包:https://studygolang.com/dl
goland:https://www.jetbrains.com/go/download

# go version 查看go的版本

# go env   查看go的环境变量
GO111MODULE= # 没有值或者off,表示没有开启go mode模式,用的就是gopath模式
GOROOT=c:\go  # go开发包的安装路径,确认好是否对
GOPATH=C:\Users\Administrator\go # 代码存放路径,确认好是否对,以后你的go代码都放在这个文件夹下

# 在任意位置敲go,都有这个命令,需要把 c:\go\bin加入环境变量

# go mode模式:代码可以放在任意路径

3.Hello world

  • 创建新文件

 

 

1.不管是用goland还是其他ide,新建项目的路径(代码),必须放在gopath路径下的src文件夹(如果没有手动创建出来)

2.gopath路径下会有三个文件夹:src(放代码的),pkg(编译过程产生中间的东西),bin(编译后的可执行文件)

3 创建项目,在项目下,创建go文件,起一个名字

4 执行代码(编译型语言,先编译再执行) 编译:go build xx.go -->编译成当前平台下的可执行文件,名字为xx 执行:mac: ./xx windows:在可执行文件路径下 xx.exe

package main  //表示声明main包,每一个go代码的第一行必须写这个

import "fmt"  //导入fmt包   类比python中import os os.path

func main() {//声明main函数 函数体的内容,放到大括号中
   //goland提示的a... 形参是a
fmt.Println("hello world") //在控制台输出helloworld ---> print("hello world")
}

//C:\Users\江先生\go\src\awesomeProject>go build s2.go
//C:\Users\江先生\go\src\awesomeProject>s2.exe
hello world

//或者直接编译并执行
//C:\Users\江先生\go\src\awesomeProject>go run s2.go
hello world
# 5 go命令
-go build   编译
-go install 安装,把编译好的可执行文件,放到bin路径下
-go fmt :代码格式化
-go run xx.go  编译并执行

# 6 在golang中执行
右键,选择,run可以直接运行

#7. // go语言中的单行注释使用
/*
多行注释
多行注释
*/

//ctrl+/ 可以快速注释,解注释(goland)

#8.// 程序的执行入口,是main包下的main函数
// 编译型语言,都有入口 ----对比python中一个py文件就是一个main函数

//一个go项目只能有一个main函数

4 变量的定义和使用

/*
###########
变量的定义和使用
##########
*/
package main

func main() {
//1 方式一:基本定义
//var关键字 变量名 变量类型 =变量值
//var age int=18 //定义并赋值
//var age int //定义
//age=18       //赋值

//2 方式二:类型推导(不需要加类型了,并不代表没有类型,类型都是固定的)
//var age =18
//var age     //错误,变量定义时,就要固定类型
//age=18

//3 方式三:简略声明(冒号跟等号是一起的,推荐第三种)
// age :=18
//age   //更不对了
//age=18

//4 同时定义多个变量
//var age,a,b,c int=18,19,20,21
//var age,a,b,c =18,19,20,21
//age,a,b,c :=18,19,20,21
//变形(能看懂,表示在定义即可)
//var (
// age=19
// name="lqz"
// sex="男"
//)

//5 变量要先定义再使用
//a=19
//a:=10

//6 变量不能重复定义
//var a int=18
////var a=19 // 报错(重复定义)
////a:=19
////简略声明的小特殊(若之前定义过a,可在冒号前,至少有一个未定义的变量即可重复定义)
//b,a:=17,18
//
//fmt.Println(a,b)

//7 变量类型是固定的
//var a int=18
//var a=18
//a:=18
//a=80
//a="xxx" //不可以在改为字符串(原因是go中该变量存的就是个数值,而不是像python中存的是地址)
//fmt.Println(a)


//Printf,%T表示类型,%d表示数字,%s表示字符串
//fmt.Printf("age的类型是:%T,值是:%d\n", age, age)
//fmt.Println(age)

/*
注意:
1 变量定义了,必须使用,否则报错
2 包导入了,要使用,不使用就报错
3 先定义再使用
4 不能重复定义
5 类型固定
*/

}

/*
在python中一切皆对象,对象就是个地址是引用
*/

 

5 常量

/*
###########
常量:恒定不变的量,建议常量全用大写
程序运行过程中,不会改变的值,数据库的连接地址,端口号
##########
*/

package main

func main() {
//1 const关键字 常量名 常量类型 =值
//const age int =99

//2 常量可以定义了不使用
//const age int =99

//3 类型可以省略
//const age =99
//fmt.Printf("%T",age)

//4 同时定义多个常量
//const (
// AGE=19
// NAME="lqz"
// sex="男"
//)
//fmt.Println(AGE)
//
////5 改变常量(不允许)
//AGE=199
//fmt.Println(AGE)

}

 

6 基本数据类型

/*
###########
基本数据类型
##########
*/
package main

func main() {
/*
1 数字类型
有符号整形:(长度不同,表示的数字范围不一样)
-int:在32位机器上是int32,在64位机器上是int64
-int8 :8个bit位,一个字节,正负 2的7次方-1的范围
-int16: 正负 2的15次方-1的范围
-int32:
-int64:
无符号整数:
-uint8 :2的8次方-1
-uint16:
-uint32
-uint64
浮点型:
-float32:精度不一样
-float64:一般用64
复数:
-complex类型:(了解,不知道更好)实部和虚部
其他:
-byte:uint8的别名
-rune:int32的别名

//2 字符串类型:用双引号包裹的内容,反引号 ``
反引号可以换行


//3 布尔类型
true false (小写)
*/

//var a int=200
//var a uint8=-200
//fmt.Println(a)

//浮点型
//var a float32
//var b float64

//复数
//var a complex64 = 9i+10
//fmt.Println(a)

//字符串
// var name string ="lqz \n" +
// "is " +
// "big"
// //var name = "lqz"
// var name2 = `egon
// is
//big`
// fmt.Println(name)
// fmt.Println(name2)
//双引号内如果有双引号? 加\转义
//var name string ="lqz \"dafds\"is "
//var name1 string =`lqz "dafds"is `
//fmt.Println(name)

//布尔类型
//var a bool =true
//var a =true
//a :=true
//var b bool =false
//fmt.Println(a)
//fmt.Println(b)



//类型转换(强类型:不通类型之间不能做运算)
//类型转换
//var a int =19
//var b float32=18.1
//float转成int类型,小数点后直接弃用,不是四舍五入
//fmt.Println(a+int(b))
//var b float32=18.9999
//fmt.Println(int(b))

//恶心的地方(了解)
//var a int =199   //64为操作系统int64
//var b int64=199
////int和int64不是一个类型
//fmt.Println(a+int(b))

}

 

posted @ 2020-04-21 00:51  Mr江  阅读(221)  评论(0编辑  收藏  举报