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

64 阅读4分钟

Go语言特点

  1. 高性能、高并发
  2. 语言简单、学习曲线平缓、上手容易
  3. 丰富的标准库
  4. 完善的工具链
  5. 静态链接
  6. 快速编译
  7. 跨平台
  8. 垃圾回收

Go的一个基础程序 - hello world

package main

import (
	"fmt"
)

func main() {
	fmt.Println("hello world")
}

Go的基础语法

数组

数组有2种赋值方法,如

var a[5]int
a[4] = 100
//int代表一种数据类型,可以替换;[]中的数字表示数组长度

或直接赋全部值

b := [5]int{1,2,3,4,5}

二维数组的赋值方法用第一种表示则为

var twoD [2][3]int

切片

切片是一种可改变长度的数组,可以增加减少元素数量,并在内存不足时主动扩容

// 使用 make 函数创建切片
// var 切片变量 = make([]类型, 长度, 容量)
var s = make([]int, 6, 6)
var s = make([]int, 6)
//以上2个声明等价,等第三个值不填时,默认长度与容量相同

创建完成后,可以对切片进行操作赋值或者增减值

//可以直接赋值
s[0] = "a"
s[1] = "b"
s[2] = "c"
//可以使用append函数添加值
s = append(s, "d")
s = append(s, "e", "f")
fmt.Println(s)// [a b c d e f]
//可以使用copy函数复制切片
copy(c, s)
fmt.Println(c)// [a b c d e f]

其实输出时也可以选择部分输出,如
fmt.Println(s[2:5]) 输出从 s[2] 即第二个位置到第五个位置、不包括第五个位置的所有元素,输出 [c d e] 如果程序写作 fmt.Println(s[:5]) 则输出从 s[0] 到第五个位置所有元素,输出 [a b c d e]

map

在Go语言中,map类型可以写为map[k]v,其中 k和 v分别对应key和value。 可以通过make函数创建一个map,如:

m := make(map[string]int)
m["one"] = 1
m["two"] = 2
fmt.Println(m)   // *map[one:1 two:2]*

也可以用map字面值的语法创建map,同时还可以指定一些最初的key/value:

m2 := map[string]int{"one": 1, "two": 2}
fmt.Println(m2)   // *map[one:1 two:2]*

使用内置的delete函数可直接实现元素删除,如 delete(m,"one") 如果key不属于m,那么相应的value便表示为0, false
如下:

r,ok := m["unknow"]
fmt.Println(r,ok) // 0, false

range

range主要在for循环中使用,遍历数组、切片、map等结构 假定数组nums{2, 3, 4},演示range遍历数组的一个使用

sum := 0
for i,num := range nums{
    sum +=num
    if num ==2 {
        fmt.Println("index:", i, "num:", num) //index:0 num:2
    }
}
fmt.Println(sum) // 9

指针

Go语言中的指针应用和我学习过的C语言中使用的指针类似,取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。
声明函数add2ptr:
fun add2ptr(n *int) { *n +=2 }

n := 5
add2ptr(&n) //  7

于是可以通过函数add2ptr直接改变 n 的值,而普通的函数则无法改变 main 函数中各个参数value的值

JSON 处理

在Go语言中,JSON是一种常用的数据交换格式,也是一种字符串表示的数据结构。Go语言提供了标准库中的encoding/json包,用于处理JSON的编码和解码操作。

type userInfo struct { 
    Name  string 
    Age   int `json:"age"` 
    Hobby []string 
}

func main( ) {
    a := userInfo{Name: "wang”, Age: 18, Hobby: []string{"Golang", "TypeScript"}} 
    buf,err := json.Marshal(a)    
    if err != nil { 
        panic(err) 
    } 
    fmt.Println(string(buf))  // {"Name”: "wang", "age”:18, "Hobby":["Golang","TypeScript"]} 
    var b userInfo 
    err = json.Unmarshal(buf,&b)    
    if err !=nil { 
        panic(err) 
    } 
    fmt.Printf("%#v\n",b) // main.userInfo{Name: wang,Age:18, Hobby:[Golang TypeScript]} 
}

在这个简单程序中,json标签被用于指定结构体字段在JSON对象中对应的键。在userInfo结构体中,Age字段使用了json:"age"的标签,表示在序列化为JSON字符串时,该字段将使用age作为键。创建userInfo类型的变量a后,我们使用json.Marshal()将变量a编码为JSON字符串,并将结果存储在buf变量中。之后使用json.Unmarshal()将buf变量中的JSON字符串解码为一个新的userInfo类型的变量b,b中的内容和a相同,我们可以看到了简单json编码的一次顺利过程。

个人思考

通过这几天的网课学习,我对Go语言的基础语法及其应用有了许多理解,但是课上老师讲的内容只是一些大致了解,配合《Go语言圣经》我有了更多的理解,之后也需要自主的进一步学习。在接下来学习中我会认真研究Go语言的实操,明白语言的应用。
Go语言拥有丰富的标准库和强大的工具链,这些库和工具能够满足各类应用开发的需求。标准库中包含了很多实用的功能,例如网络编程、文件操作、并发处理等,而工具链可以提供代码格式化、静态分析、测试和性能优化等功能,提高了开发效率和代码质量。但同时,各种go自带的函数以及结构自己还有许多都不了解,在观看教学视频时也产生了许多困惑,需要多花时间去思考。