学习go的操作(本人已有c的基础,请思考后再看)

建立一个文件(我的第一个文件是hellow.go),后在终端执行一下几步:我用的是go build先编译成了可执行文件(.exe)【1.go build hellow.go        2.hellow.exe】。当然,你也可以用go run直接运行【go run hellow.go】,本质过程是一样的。【.exe文件可以在其他电脑上跑(因为编译器将程序运行的库文件包含在可执行文件中),但是.go的文件不可以。】

 

 

 就可以在处理窗口(第二排)看到执行结果了。

运行的快捷方式:1.在路径出口清除路径后输入cmd会直接跳转

 2.

 

 如果程序没有错误,就不会有任何提示,会在当前目录下生成一个可执行文件(win:.exe        linux和mac是二进制文件)如果程序有错误,那么会在编译时报错。

cd ..        返回上一级

------------------

修改字体:文件->首选项->设置->定位到你要修改的地方的左边的笔,在右边直接修改对应的参数【机器会用】你改的覆盖原指令。

Go语言的注意事项:

1.文件后缀必须是.go

2.Go的执行入口是:main()函数

3.Go严格区分大小写

4.Go的每个语句后不需要加分号(;),简洁性

5.一行代码只能写一行语句

6.Go语言中定义的变量或者import的包如果没有使用,代码不能通过。【因为在做项目和工程时,需要不止一个人,如果变量不用的话,对接你的代码的人也不敢乱删,所以就会造成浪费】

7.大括号是成对出现的,缺一不可

----------------------------

Go的转移字符:\t        \n        \\:输出一个\,第一个\作为转移符号        \":输出一个"        \r:回车,注意和想象的有点不一样!!真实的情况是这样的:

原理解释:先输出ABCD,回车:不换行,并且用\r后面的 覆盖前面的内容 

------------

在有包(多半是main包)重复的情况下,可以直接拖动对应文件到其他文件夹下面,如果编译还是过不去,大概率是因为处理器还是在描述刚刚的错误【(*^_^*)】,你可以这个时候稍微 动一下内容,变一点无伤大雅的改动啦。{20节}

Golang开发常见的错误和解决方法:

1.The system cannot find the file specified.        原因:系统找不到可执行的文件

2."xxx"不是内部或外部命令,也不是可运行的程序或批处理文件。        原因:文件名不存在或写错,或者当前路径错误。        

3.语法错误:不好区分字母,长得像(1和l );方法:去读编译器的报错

----------Go语言的注释:提高代码的可读性(方便自己和别人读)两种:1.//        2./* */  【里面不要嵌套/**/,逻辑上会有错误】

-----------------快捷键

ctrl+\:对选中的对应行全部加上// 的行注释,第二次就可以取消注释了

shift+alt+向下键:向下复制这一行代码

shift+tab:向左移        tab:向右移

-----------------Go规范的代码风格:

1.尽量使用行注释

2.正确的缩进和空白:

gofmt:在cmd里面使用 -w 以后才能让文件格式化,不然只是屏幕上面格式化了。

 3.运算符两边各加一个空格:比如: 2 + 4 * 5 这样

4.代码不可以这样写:设计者规定代码风格要统一,思想:一个问题一个解决方法

func main()

{

        xxxx

}

正确的:

func main(){

        xxxx

}

5.行长规定:一行最长不要超过80个字符,(超过请换行),尽量保持格式优雅,可以在Printin里面过长的地方加",然后再换行。如:

变成这样:

 

但是屏幕里面这样不会有换行效果。

是这样子的:

 

Golang的API文档:中文网网址:Go语言标准库文档中文版 | Go语言中文网 | Golang中文社区 | Golang中国 (studygolang.com)

包:就是电脑上的一个一个文件夹。

调用函数的方式 :import 包名

dos的常用指令:(4条消息) DOS的常用指令:_薄荷糖yh的博客-CSDN博客

回顾文件的使用流程:

hhh 

 定义一个变量:%v可以输出

匿名变量:不需要名字,—【下划线】,return 【xx】

 注意事项:

 变量使用方式:

1.指定变量类型,不赋值【变量为默认值        eg:int的默认值为0】

2.根据值自行判断变量类型(类型推导)【动态编程的特点】

eg:var num=10.32        这个num就是小数类型

3.省略var,【特色】变成了这样        变量 := 【赋值】,冒号不省,否则是赋值

4.多变量声明:eg:        var v1,v2,v3        fmt.Println("n1=",n1,"n2=",n2,"n3=",n3)        最后就会输出三个零了。

当变量不一样:        var n1,  name,  n3  =  100,  "tom"  ,888        最后输出100,tom,888

当然,对多变量的类型推导:        n1,  name,  n3  :=  100,  "tom"  ,888

全局变量【函数外部】的多函数:go里面的全局变量在定义的时候不可以过于省略,必须写关键字 var

var(

n1=100

n4=56

)

变量在对应生命区域可以在同一类型不断变化【会出现红色波浪线】

变量如果一开始没有赋值,就使用默认值。【eg:int=0;小数=0;string为空串】

变量基本语法:var 变量名 数据类型        【var i int        var num float】

变量初始化[声明时赋值]:var i  = 10       可以不用写类型了,自己数据推导

 " + "的使用:1.左右两边都是数值类型:进行加法运算        2.两边都是字符串类型:进行字符串拼接。

如果你要混合定义很多个变量的话:var (

name = "alex"

age = 19

salary = 80000.00

hobby string

)

 当int bool string这三种类型进行变量赋值操作时,go会赋值原来的值【新地址】,这是值类型引用

 

name变量的值内容若改变, 它的地址还是不改。

常量

1.【定义常量:const  a  int  =  18】a := 18   只能定义变量。常量在定义的时候必须一起赋值。

const  a  int 是错误的,定义域和变量差不多,多半用于全局              多个常量赋值也可以这样:

const(

v1=18.2

v2=34

)

最后都fmt.Println(v1,v2,v3)

2.iota(计数器,可被修改的常量)

const(

v1 = iota

v2

v3

)               

的效果等同于 

const(

v1 = 0

v2 = 1

v3 = 2

)

如果想让开头的值不为0,可以v1 = iota+1   操作;‘如果中间想要跳过一个值的话可以定义一个不用的变量【匿名变量】

const(

v1=iota

_        //这是一个下划线开头的变量,最后没有输出它

v2

v3

)

iota每生成一个常量就加一,无论用不用的上

const(

v1 = iota

v2=100

v3=iota

)                   最后输出的是0 100  2

数据类型介绍:

(一)基本数据类型

1.数值型:       

1.1整数型:int  int8【8位的int相当于一个byte,可以表示的范围是 -128-127  {-2^7 -- 2^7 有一个空的符号位  }】int16  int32【4个字节】  int64             

1.2浮点数:float32【4字节】         float64                {unint表示无符号的int,范围:0到2^8,没有负数了}

2.字符型【文本】:没有专门的字符型,用byte来表示单个字母字符(不是汉字,按照编码规定,一个汉字三个字节)

3.bool(布尔类型):只有true和false两种类型,也可以用于判断条件。多用于if 循环 条件表达式等        0和1不能表示bool类型,在go里面

4.字符串(string)【[] byte】:go归为基本数据类型        {java归为复杂数据类型}

字符串的反引号换行:

s4 := `

xxx        

`

字符串的连接:1.加号        2.fmt.Printf("%s,%s",a1,a2)//URL里面拼一个URL   

3.a1 := "hhhh"             a2 := "aaaa"        s:=strings.Join([ ].string{a1,a2}," , ")   //join:连接     fmt.Printf("s= %v\n",s)

4.用buffer直接写到缓冲区

var buffer bytes.Buffer
buffer.WriteString("tom")
buffer.WriteString(",")    
buffer.WriteString("20")
fmt.Printf("%v \n",buffer.String())

注:rune==int32        //int的别名,表示一个Unicode码点,可以存汉字。

5.进制:%b %d  o开头表示输入8进制 (%o输出)       ox表示16进制(%X或 %x,输出大小写的区别)

6.复数(实部与虚部)var a complex         a = 1 + 2i

(二)复杂数据类型

1.指针        2.数组        3.结构体        4.管道:Channel,多并发        5.函数

6.切片        7.接口        8.map:有点像集合

切片操作:

str := "hello world"
n:=3
m := 5
fmt.Println(str[n])                //获取字符串索引位置为n的原始字节
fmt.Println(str[n:]) //截取得字符串索引位置为 n 到 m-1 的字符串fmt.PrintIn(str[n:]) //截取得字符串索引位置为 n 到 len(s)-1 的字符串
fmt.PrintIn(str[:m]) //截取得字符串索引位置为  到 m-1 的字符串

常用函数:len(i)        //查看字符串长度

strings.Spit(s,"   ")        //第二个参数是 一个空格,把字符串分割成数组[xxxxxxx]

strings.Contains(s,"   ")//是否包含某一个字符串,返回bool类型【布尔】

strings.Hasprefix(s,"字符串输入前缀")//判断前缀大小写,小写返回true

strings.HasSuffer(s,"字符串输入后缀")//判断前缀大小写,小写返回true

strings.Tolower(s)        //把字符串全改成小写

strings.ToUpper(s)        //把字符串全改成大写

strings.index(s,"xxx")        //找到""里面的位置第i个位置

strings.Lastindex(s,"xxx")        //找到""里面的位置第i个位置

输入:

fmt.Scan:必须要把里面的所有值都得到才会继续走

fmt.Scanln:只等待回车,可以不输完要求的值

fmt.Scanf:可以输入固定的模板(像c那样),但是%s这样的格式化字符的时候,必须打一个空格作为分界【分界不明显】

这三个函数都有返回值:count error。可以打印出来,帮助验证函数。

但是他们不能解决的问题:用户输入较多也有空格要读【不容易区分边界】

方法:系统的输入输出

reader := bufio.NewReader(os.Stdin)        //rangreader去os.Stdin里面去读用户输入内容

line , isPrefix , error := reader.ReaderLine() //ReaderLine表示reader从里面读一行(大概4096字节)

data := string(line)        //把line转化成字符串

fmt.Println(data)

注:isPrefix 是标志,如果一次性没有读完,那么Prefix=true,再去读取,只有在读完的瞬间才是false        别搞错了!!

条件语句:

1.基本  eg:

if age==1 {                //与c只有不加括号的区别

。。。。

}else{

。。

}

2.多条件判断

if age==1 {                //与c也只有不加括号的区别

}else if 条件1{

}else if  条件2{

}else{

}

3.嵌套

if xx{

if xx {

        }

}

注意:嵌套不要太多!!!!会啰嗦且无效率

switch case

与c相比,也仅仅是无括号 :

switch  xx {

case 1:

case 2:

default:

}

for:4种形式

1.死循环        for {

fmt.Println("开心开心")

time.Sleep(time,Second * 1)        //在运行到这里的时候会停一秒

}

2.有条件的循环         for  age==1【条件块】 {

xxxx

}

条件块可以是变量,但是必须是bool类型

flage := 1

for flage{

xxx

}        这是错的,改成

flage := true

for flage{

xxx

}        是对的

3.声明变量加条件

for i:=1 ; i<10 ; {

xxx

i++

}

改良

for i:=1 ; i<10 ;i = i + 2 {        //也是c没有加括号

xxx

}

关键字:

break  continue 也在

但是go里面有一个打标签对for进行打标签,然后通过break和continue就可以实现多层循环的终止

f1 :for i:=1 ; i<3 ; i++{

        for j:=1 ; j<5 ; j++ {

        if j==3 {

                        continue f1;        //continue现在表示停止f1这一次循环了

                }

        }

最终输出结果:

1 1        1 2         2 1        2 2 

f1 :for i:=1 ; i<3 ; i++{

        for j:=1 ; j<5 ; j++ {

        if j==3 {

                        break f1;        //continue现在表示停止f1这一次循环了

                }

        }

最终输出结果:

for range循环,

数组和切片返回 索引和值

数组: a := [5]int{1,2,3}        切片 :动态数组: s := [ ]int{1,2,3,4}

map返回  键key和值value

m := make(map[string]string,0)

m["name"] = "tom"        m["age"] = "20"       

for key,value := range m{

fmt.Print("%v:%v        ",key,value)

}

最后输出结果:name:tom        age:20        

通道,返回通道值:用于处理数据并发

range就像一个函数,有返回值,【索引和值或者 键和值】可以让返回值在for循环里面表示出来。

func Hell()string{

这个函数(Hell)的返回值就是string

%T可以格式化输出对应变量类型        %v输出值(value)

大写共有,小写私有

******************依赖管理***************

"go modules"

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值