Go语言特点
- 高性能、高并发
- 语言简单、学习曲线平缓、上手容易
- 丰富的标准库
- 完善的工具链
- 静态链接
- 快速编译
- 跨平台
- 垃圾回收
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自带的函数以及结构自己还有许多都不了解,在观看教学视频时也产生了许多困惑,需要多花时间去思考。