快速上手golang

快速上手golang,第1张

goland第一个程序 Hello, Golang
package main

import (
   "fmt"
)

func main() {
   fmt.Println("Hello, Golang")
}

第一句类似于java语言中的打包,用package main定义包名为main,package main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。

然后导入fmt这个库,fmt主要实现格式化IO(类似于C++中的cstdio这个头文件,这个包中有类似于scanf和printf的函数),func main为程序的入口,我们调用fmt库的Println(ln即为line,在输出最后会自动输出一个换行符,和java中的println一致,注意首字母大写,而在java中首字母小写)这个函数,将语句输出到控制台

【语言规范】

golang这门语言与python类似,每行句尾没有分号,一行代表一个语句的结束,但是如果你把多条语句放在一行,中间必须以;隔开(这是不推荐的)而在C和java都需要在最后加上一个;大括号不可以单独放在一行,会报错 如何声明变量? golang有三种声明变量的方法

第一种方法:直接声明,var 变量名称 = 值,golang会自动判定值的类型从而赋值给变量,我们也可以只声明一个类型的变量而不赋值

var a = "hello"
var flag = true
var d float64

第二种方法:我们也可以在变量名称后面加上变量的类型直接告诉编译器,常见的类型有int,float32(类似于其他语言的float),float64(相当于其他语言的double),string和bool(java中的Boolean)等

而且golang同时一句可以进行多个变量的声明(在python语言中我们也可以这样做,内部是通过元组赋值)

var b, c int = 3, 6
var s string = "go"

第三种方法:直接用:=进行赋值,好处不需要用var声明,而且不需要写类型,在golang中我们也可以使用+可以进行字符串的拼接

a := "hello" + "world"
flag := true
b, c := 3, 6
用const声明常量

在golang中常量没有类型,常量通过他的值自动判断类型,但是我们仍然可以像声明变量类型一样,在变量名称后面带上常量类型

const a = "base"
const g float64 = 132.6
const f = true
与众不同的if判断语句

在golang中,if后面的判断条件并不需要加小括号(类似于python),但是if后面并没有冒号,而是直接跟上一个大括号,所以不能像C++一样把语句与if直接写在同一行

if 6%2 == 0 {
   fmt.Println("6是一个偶数")
} else {
   fmt.Println("6是一个奇数")
}
循环我只用for,栓q

golang语言没有其他语言常见的while和do-while,而只有for循环,continue和break同样适用

死循环的写法如下

for {
   fmt.Println("我永远也不会停下来,爱信不信~")
}

for循环的格式与C类似,只不过并没有小括号,下面代码为求出从1到100的和(Println里面如果想输出多个值,可以在中间用逗号分隔,与python的print语句类似)

sum := 0
for i := 1; i <= 100; i++ {
   sum += i
}
fmt.Println("从1累加到100的和为", sum)

在for循环中的三个语句中,任意一个都可以省略,例如上面的语句也可以这样写

sum := 0
i := 1
for i <= 100 {
   sum += i
   i += 1
}
我的switch不需要break

众所周知,在C语言中,如果你的switch语句中的case不带break的话,将会执行后面全部的语句直到结束,然而在golang中你不需要这种烦恼,因为golang中,只要你进入某个case,执行完这个条件的语句之后就会自动跳出switch,而不会一直执行到末尾

switch sum {
case 1:
   fmt.Println("错啦")
case 2:
   fmt.Println("还是错啦")
case 5050:
   fmt.Println("对啦")
case 3:
   fmt.Println("试试会不会输出这一句")
default:
   fmt.Println("这句是默认输出")
}

例如上面的句子,switch在输出对啦之后不会虽然没有break但是不会继续输出后面的“试试会不会输出这一句”

而且golang中的switch更加高级,可以应用于任何数据类型,比如字符串和结构体,甚至可以用来取代if-else语句,你可以在switch后面不写任何变量,然后在每个case里面写条件分支

grade := 88
switch {
case grade >= 60:
   fmt.Println("及格")
case grade < 60:
   fmt.Println("不及格")
}
数组声明

数组的声明与变量类似,我们需要加上一个方括号,里面加上数据类型,但是与声明变量不同的是,声明数组必须带上数据类型,否则会报错,我们可以用len(数组名称)来获得数组的大小,golang中的数组也是从0开始索引

var a [5]int
a[0] = 1
fmt.Println(a, len(a))
b := [5]int{1, 2, 3, 4, 5}
fmt.Println(b)
可变长数组——切片slice

由于数组是固定长度的,在使用的过程中会有很多局限性,所以我们可以使用切片(slice)来产生一个可变长的数组

下面代码,我产生了一个存放三个字符串的切片,由于没有给a[1]赋值,a[1]默认为一个空白字符,而且golang中的切片可以用append来增加元素,但是与python的直接调用append方法不同,golang用append这个函数,将返回值再次赋给a实现增加元素

a := make([]string, 3)
a[0] = "a"
a[2] = "b"
a = append(a, "d", "e")
fmt.Println(a)
用copy进行切片的拷贝

我们可以用copy这个函数将原来的切片拷贝给一个新的切片

c := make([]string, len(a))
copy(c, a)
fmt.Println(c)
顾名思义,切片支持切片

与python中的切片类似,我们也可以对切片进行切片 *** 作[:]也就是取出所有元素,[起始索引,终止索引],并不包括终止索引,也就是左闭右开,而且并不支持像python里面的负数索引,golang中必须用正值

s := []string{"h", "e", "l", "l", "o"}
fmt.Println(s[:])
fmt.Println(s[2:4])
跟字典差不多的集合map

在golang中,我们可以使用make(map[key类型]value类型)来创建一个空的map,其中的key和value也就是我们常说的键值对,方括号里面写入键的数据类型,外面是值的数据类型。

在下面的例子中,我们创建了字符串——整型这样键值对的map,如果能在map中找到该键,那么直接返回该键的值,如果找不到,则返回值类型的默认值下面的a[“c”]因为map中没有这个键值对,所以会返回一个0

而且我们可以在取值的过程中,多加一个布尔变量,取到map中是否有该键,如果有,这个布尔取到true,如果找不到则取到false

a := make(map[string]int)
a["a"] = 1
a["b"] = 2
fmt.Println(a)
fmt.Println(a["b"])
fmt.Println(a["c"])
r, flag := a["b"]
fmt.Println(r, flag)
m, flag := a["c"]
fmt.Println(m, flag)

我们同样可以直接用{}定义一个map,然后用delete删除里面的键值对,delete的第一个参数为删除的map名称,第二个参数为要删除的键,下面的程序删除了a-1这个键值对,第二次输出只有一个b

a := map[string]int{"a": 1, "b": 2}
fmt.Println(a)
delete(a, "a")
fmt.Println(a)

【注意】map在输出的顺序是一个随机的顺序,而不是你插入或者定义的顺序,也不是字母顺序

使遍历更加方便的range

我们在遍历数组或者map的时候,可以用range,range会返回数组的索引,也能返回map的键值对

在下面的代码中,我使用i来接受数组中每个元素的索引,用key来接受字典中的键,value来接受值,而且可以只用一个参数来接受字典的键,但是如果你想要得到字典中的值,需要在前面加上一个变量来接受键

【注意】如果你只想要取得数组中的值,不能只用一个参数来接受,这样只会取到索引值,我们可以用类似字典的方法,_,value := range 数组名称 这样只获得数组的值

a := []int{1, 2, 3, 4}
for i, num := range a {
   fmt.Println(i, num)
}
m := map[string]int{"a": 1, "b": 2}
for key, value := range m {
   fmt.Println(key, value)
}
for key := range m {
   fmt.Println(key)
}
for _, value := range m {
   fmt.Println(value)
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/996280.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存