Go 语言入门指南
1. 程序入口
在go语言中,main函数是程序的入口点。运行一个Go程序时,main函数会自动执行。不需要显式地调用。
2. 变量声明
变量的声明语句有点像js,var用来声明变量,可以明确指定类型或通过初始化值推断类型。const用来声明常量。
3. 循环控制
for循环是Go语言唯一的循环结构,支持经典的C风格循环、无限循环以及基于条件的循环,可以使用break和continue控制循环。同样的,也可以在循环条件中初始某一变量。
4. 条件判断
if-else语句与C语言类似,可以在if条件内初始化变量(第一件这样的,比较抽象)。switch语句可以替代多个if-else,且支持无表达式的条件分支case可以匹配多个条件值,default是默认分支。
5.数组和切片
和C相同,普通数组是定长的,不过可以用make语句创建一个切片,成为一个动态数组,切片可以分片操作,一些数据的语法与python比较相似
6.Map
基本相同与哈希表,动态增删键值对,不过和js的map.get方法不同,go直接使用map['key']就可以访问值(有两个返回值,第一个是val,第二个是ok)val, ok := m["key"]
7. 函数定义
Go语言函数支持多个返回值。返回值可以是命名的,也可以匿名返回。参数类型相同时,可以将类型声明简化。返回值类型写在括号外。
func add(a, b int) int { return a + b }
func divide(a, b int) (int, error) { /* ... */ }
8. 指针
Go语言有指针,但不支持指针运算。使用&获取变量地址,用*访问指针对应的值。函数可以接收指针作为参数,直接修改外部变量的值。指针的内容我在js涉略较浅,估计在go里面又要头疼半天了。
9. 结构体
又来到了经典c语言解构,所谓结构体类似于类,用于定义数据类型。结构体字段可以使用点运算符访问和修改。可以通过指针传递结构体,减少复制开销。
在js中,es6之后可以用class创造类,也类似于结构体了
10. 结构体方法
方法是关联到某个类型(通常是结构体)的函数。可以为结构体定义值接收者和指针接收者的方法,指针接收者允许修改结构体的值。
第一次见结构体方法,不过其实在js中,也尝试调用过某个对象的方法。
func (u User) displayName() string { return u.Name }
func (u *User) setName(name string) { u.Name = name }
11. 错误处理
Go语言没有异常机制,使用error接口处理错误。通过errors.New创建错误,或者返回nil表示无错误。
if err != nil { return nil, errors.New("some error") }
12.字符串处理
package main
import (
"fmt"
"strings"
)
func main() {
a := "hello"
// 搜索
fmt.Println(strings.Contains(a, "ll")) // true
// 返回包含某字符串的个数
fmt.Println(strings.Count(a, "l")) // 2
// 判断字符串是否以指定的字符串开头或结尾
fmt.Println(strings.HasPrefix(a, "he")) // true
fmt.Println(strings.HasSuffix(a, "llo")) // true
// 返回第一次出现target的位置
fmt.Println(strings.Index(a, "ll")) // 2
// 字符串拼接
fmt.Println(strings.Join([]string{"he", "llo"}, "-")) // he-llo
// 字符串重复
fmt.Println(strings.Repeat(a, 2)) // hellohello
// 字符串替换
fmt.Println(strings.Replace(a, "e", "E", -1)) // hEllo
// 处理字符串,返回一个数组,这个方法和js的相同
fmt.Println(strings.Split("a-b-c", "-")) // [a b c]
fmt.Println(strings.ToLower(a)) // hello
fmt.Println(strings.ToUpper(a)) // HELLO
fmt.Println(len(a)) // 5
b := "你好"
// 中文字符串的长度不同于英文字符串
fmt.Println(len(b)) // 6
}
13.JSON处理
Go语言支持encoding/json包来编码和解码JSON数据,Marshal和Unmarshal用于转换。
import "encoding/json"
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
jsonData, _ := json.Marshal(person)
var p Person
json.Unmarshal(jsonData, &p)
参考资料
字节青训营资料