Go语言基础

273 阅读4分钟

1.0 go语言的变量

go语言定义变量格式都是var开头(go语言中字符串是内置类型,可以直接用“+”拼接 eg:g:=a+"for") 变量声明的两种方式:

(1)var+变量名=值 (一般会自动推导出变量类型,当然也可以自己加以声明)

var a = "helloworld"
var b,c int = 1,2
var d=true

(2)变量名 :=值

f:=float32(e)
g:=a+"for"

1.1 go语言的常量(把变量var改为const即可)

go语言的常量没有确定的类型,是根据上下文自动确定类型

const a =30000

2.0 if-else

与java和c语言不同,go语言中if_else 后面条件不用括号 ,而执行语句必须用大括号括起来,不能写到同一行

if 8%4==0 {
    fmt.Println("hello")
}else{
    fmt.Println("world")
}

2.1循环

go语言中只有唯一一种即for循环 (三个条件控制语句任何一个都可省略)

for{
     fmt.Println("world")
} --->不加任何条件的死循环

for i:=1;i<=10;i++{
      fmt.Println("world")
}

2.2switch分支结构

在go语言中,switch功能很强大,并且不需要加break也有类似于java中break的功能(即执行符合条件的语句后便会跳过后续语句的执行)

func main(){
     a:=2
     switch a {
     case 1:
                fmt.Println("world")
     case 2:
                fmt.Println("world")
     case 3:
                fmt.Println("world")
      default:
                fmt.Println("world")
   }
}

3.0数组-----具有编号且长度固定

这里直接用代码解释

var  a [5] int   -------表示可以存放5个元素的数组a
a[4]=100  -------赋值给a[4]

3.1切片------可变长度的数组

make------来创建一个切片

s:=make([ ]string,3)
s[0]="a"
s[1]="b"
s[2]="c"
fmt.Println("get:",s[2])   ----- c
fmt.Println("len:",len(s))   ----- 3

apend------增加元素 (需要把apend的结果赋值给原数组)

s=apend(s,"d")
s=apend(s,"e","f")

fmt.Println(s[1:4]) ------->[b c d]  (不包含第4个元素  >>这里和python一样,但go不支持负数索引)
fmt.Println(s[:4]) ---------->[a b c d]
fmt.Println(s[2:])   ----- [c d e f]

good:=[ ]string{"a","b","c"}
fmt.Println(good) -------->[a b c]

4.0 map(即哈希或python中的字典)

这里直接用代码解释

m:=make(map[string]int) ------创建一个空map,key类型为string,value类型为int
//写入key位对
m["one"]=1
m["two"]=2
fmt.Println(m) --------map[one:1,two:2]
fmt.Println(len(m))----------2
fmt.Println(m["one"])-------1
fmt.Println(m["unknow"])-------0

r,ok:=m["unknow"]  //用ok来获取map里是否有这个key存在
fmt.Println(r,ok)---------0  flase
//删除key位对
delete(m,"one")

5.0 range

range遍历会返回两个值,一个是索引,一个是对应位置的值 (在golang中遍历map输出是随机的顺序)

//遍历数组
nums:=[ ]int{2,3,4}
sum:=0
for i,num:=range nums{
    sum+=num
    if num==2{
fmt.Println("index:",i,"num:",num)//index:0  num:2
  }
}

//遍历map
m:=map[string]string{"a":"A","b":"7"}
for k,v:=range m{
   fmt.Println(k,v) //b 8;a A
}
for k:=range m{
   fmt.Println("key",k)//key a;key b
}

6.0 一个Go语言包只能有一个main()入口函数

在Go语言中,main()函数属于我们前面讲到的main包,main()函数是程序的入口,一个能独立运行的Go程序必须有一个main(),main()下面包含的代码就是整个程序要做的事情,注意Go中函数的语法格式和Python有较大差异,首先,Go中定义函数的关键字为func(Python中为def),其次函数的内容是写在{}括号里面,函数名后面不再像Python那样需要接一个冒号:。

在Go语言中,一个程序里有且只能有一个main(),所有我们通过import导入的包里的函数,或者用户自定义的函数都必须直接或间接地在main()函数中调用,另外main()函数本身不带任何参数也不会返回任何值。

综上,一个可执行的Go程序必须具备一个main包,main包里必须包含main()这个入口函数。运行Go程序的本质就是运行main()函数,main()函数运行完毕也就意味着程序执行完毕。

下面来做练习,首先回到VSCode中,在Go文件夹下新建一个go workplace文件,将其取名为helloworld.go,然后写入下列代码:

package main
import("fmt")
func main(){
	fmt.Println("hello world 你好 let's Go!")
}

这时如果你观察仔细的话,会在VSCode里的PROBLEMS里看到“main redelcared in this block”的警告提示,如下图所示:

image.png

这是因为在Go语言中一个目录(文件夹)代表一个包,一个文件夹下的同级go文件归属于同一个包,一个包下面只能有一个main()入口函数。这里我们在helloworld.go文件所在的Go文件夹下另外创建了一个叫做firstDay.go的文件,此时helloworld.go和firstDay.go都在Go这个文件夹下面,也就意味着它们同属于一个包,因为前面我们已经在helloworld.go里使用了main()函数,因此不能再在firstDay.go里面使用main()函数(注意当出现一个文件夹下出现多个main()函数的情况时,VSCode给出的“main redelcared in this block”只是警告提示,并不是错误提示,这也就意味着helloworld.go和firstDay.go这两个程序其实依然可以正常运行,读者可以通过go run helloworld.go和go run firstDay.go来分别运行这两个程序做验证)。

解决这个警告提示的办法有两种:

  1. 为firstDay.go单独创建一个目录,比如这里我们在Go文件下面新建一个叫做first的子文件夹,然后将firstDay.go放进去,此时因为firstDay.go和helloworld.go已经被隔离开分属不同的目录(包),所以之前的VSCode给出的“main redelcared in this block”警告提示就此消失。

image.png

2.对一个目录(包)下存在两个main()函数放任不管,因为“main redelcared in this block”只是一个警告,并不是错误,因此并不妨碍我们在终端下通过go run来分别运行firstDay.go和helloworld.go两个程序。