青训营X豆包MarsCode 技术训练营第二篇 | 豆包MarsCode AI 刷题

35 阅读3分钟

Go 语言入门指南

1. 程序入口

在go语言中,main函数是程序的入口点。运行一个Go程序时,main函数会自动执行。不需要显式地调用。

2. 变量声明

变量的声明语句有点像js,var用来声明变量,可以明确指定类型或通过初始化值推断类型。const用来声明常量。

3. 循环控制

for循环是Go语言唯一的循环结构,支持经典的C风格循环、无限循环以及基于条件的循环,可以使用breakcontinue控制循环。同样的,也可以在循环条件中初始某一变量。

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数据,MarshalUnmarshal用于转换。

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)

参考资料

gobyexample.com/

gobyexample-cn.github.io/

字节青训营资料