Go 语言入门指南:基础语法和常用特性解析| 青训营

109 阅读3分钟

基础语法入门

helloworld程序

package main
​
import (
    "fmt"
)
​
func main() {
    fmt.Println("helloworld")
}

运行程序命令:

go run helloworld.go

编译程序:生成可执行文件

go build helloworld.go

基础语法

基础数据类型

复合数据类型

数组

定义格式:

var a [5]intb := [5]int{1,2,3,4,5} 
​
//二维数组
var twoD[2][3]
切片
s := make([]String, 3)
s[0] = "a"
s[1] = "b"
s[2] = "c"

切片不同于数组可以任意更改长度。比如说我们可以用make来创建一个切片,可以像数组一样去取值,使用append 来追加元素。

注意append的用法的话,你必须把append 的结果赋值为原数组。

因为 slice的原理实际上是它有一个它存储了一个长度和一个容量,加一个指向一个数组的指升,在你执行 append操作的时候,如果容量不够的话,会扩容并且返回新的 slice,slice 此初始化的时候也可以指定长度。

slice 拥有像python一样的切片操作,可以取出任意区间位置的元素,不包括第五个元素。不同于python,这里不支持负数索引

map

哈希表是一种巧妙并且实用的数据结构。它是一个无序的key/value对的集合,其中所有的key都是不同的,然后通过给定的key可以在常数时间复杂度内检索、更新或删除对应的value。

//格式
map[K]V
​
//创建map
ages := make(ages[string]int)
ages["alice"] = 31
ages["charlie"] = 34
    //或者是
ages := make(ages[string]int){
    "alice" : 31,
    "charlie": 34,
}
​
//访问map
fmt.print(ages["alice"])
​
//删除
delete(ages, "alice") // remove element ages["alice"]//操作value
ages["bob"]++;
​
//遍历map
for name,age := range ages{
    fmt.print("%s\t%d",name,age)
}//map的迭代顺序随机。
​
​
  • K的要求:满足可以==比较的条件
  • 无法取址:元素不是变量,不能取址

变量

go语言是强类型语言。

正常声明变量的方法:

var 变量名字 类型 = 表达式
var i, j, k int                 // int, int, int
var b, f, s = true, 2.3, "four" // bool, float64, string

其中“类型”或“= 表达式”两个部分可以省略其中的一个。

  • 省略类型:根据初始化表达式来推导变量的类型信息。
  • 省略表达式:用零值初始化该变量。

简短声明:

名字 := 表达式

单个:

i := 100   

一组:

i, j := 0, 1

注意:

“:=”是一个变量声明语句,而“=”是一个变量赋值操作。

常量

由const定义。

指针

go的指针操作有限。

对传参进行修改

//对变量进行 +1操作func add1(n int ) {
    n += 1
}//不起作用func add1ptr(n *int) {//指向一个int类型的指针
    *n += 1
}//操作实际地址的变量,行得通
​
​
func main() {
    n := 1
    add1(n)
    fmt.print(n)//1
    add1ptr(n)
    fmt.print(n)//2
}

函数

类型后置是go语法的一个特征:

func add(a int, b int) int {
    return a + b
}
​
func add(a,b int) int{
    return a + b
}

go的原生函数支持函数返回2个值,第一个值是真正的结果,第二个值一般是业务逻辑的错误信息。

func exist(m map[string]string, k string) v string, ok bool{
    v, ok = m[k]
    return v, ok
}

程序控制语句

条件分支

if else:

if 条件 {
    执行逻辑
}else if 条件{
    
}else{
    
}

后面括号可省略、但是后面必须跟同行大括号。

switch:

go的switch语句case后面可以跟任何条件

switch [变量or常量]{
    case t.hour() < 12:
        //
    default:
        //
}

这里不需要写break,不同于c/c++,go的switch是指哪打哪,不会继续往下走。

循环控制

go语言里仅有for循环,条件不用再加括号,同行 大括号必备。

for {
    
}
i := 1
for j := 7 ; j < 9; j++ {
    fmt.print(i);
}

案例

随机数——猜数字案例

import (
    "bufio"
    "fmt"
    "math/rand"
    "os"
    "strconv"
    "strings"
)
​
func main() {
    maxNUm := 100
    secretNum := rand.Intn(maxNUm)
​
    fmt.Println("Please input your guess")
    reader := bufio.NewReader(os.Stdin)
    for {
        input, err := reader.ReadString('\n')
        if err != nil {
            fmt.Println("err!!!")
            continue
        }
​
        input = strings.TrimSuffix(input, "\r\n")
​
        guess, err1 := strconv.Atoi(input)
​
        if err1 != nil {
            fmt.Println("input err!", err1)
            continue
        }
        fmt.Println("your guess is ", guess)
        if guess > secretNum {
            fmt.Println("big!")
        } else if guess < secretNum {
            fmt.Println("little!")
        } else {
            fmt.Println("yes")
            break
        }
​
    }
}