GO语言基础语法 | 青训营笔记

54 阅读4分钟

go中一定要手动把包改成main吗? 不一定需要手动将包名更改为main,这取决于你要编写的程序类型。如果你想编写一个可执行程序,那么将包名更改为main是必要的。但是如果你要编写一个库文件,你可以将包名取成任何你喜欢的名称。

值得注意的是,每个Go程序都必须包含一个main函数,而且这个函数必须在main包中定义,否则编译器会报错。当你将包名更改为main后,Go编译器会把这个包编译成一个可执行文件,其中main函数就是程序的入口点。

GO中变量类型如何定义

用var 名字的方法输入数据后可以直接判断输入的变量是什么类型

var a = "initial"   **//通过var加 变量名字=**

var b, c int = 1, 2 **//写出int可以直观的知道变量是什么类型**

var d = true

**另一种方式: 变量名 :=值

常量: const 变量名= 在GO中常量没有具体的类型,会根据使用的上下文自动判断类型**

GO中if语句

注意: 1、if后面的判断条件没有括号,如果写了括号编译器会自动去掉 2、if后面的中括号直接写在判断句的后面

package main  
  
import "fmt"  
  
func main() {  
  
if 7%2 == 0 {  
fmt.Println("7 is even")  
} else {  
fmt.Println("7 is odd")  
}  
  
if 8%4 == 0 {  
fmt.Println("8 is divisible by 4")  
}  
  
if num := 9; num < 0 {  
fmt.Println(num, "is negative")  
} else if num < 10 {  
fmt.Println(num, "has 1 digit")  
} else {  
fmt.Println(num, "has multiple digits")  
}  
}
# for循环语句

package main

s := make([]string, 3)创建切片

s = append(s, "d")使用‘append’追加元素

copy(c, s)copy可以用一个切片去拷贝另一个切片的数据

** s:a b c d e f**

fmt.Println(s[2:5]) // [c d e] 输出下表从2到5(但不包括5)

fmt.Println(s[:5]) // [a b c d e]**输出下表5之前的所有数据(不包括5) **

fmt.Println(s[2:]) // [c d e f] 输出下表2之后的所有数据(包括2)


import "fmt"  
  
func main() {  
  
s := make([]string, 3)  
s[0] = "a"  
s[1] = "b"  
s[2] = "c"  
fmt.Println("get:", s[2]) // c  
fmt.Println("len:", len(s)) // 3  
  
s = append(s, "d")  
s = append(s, "e", "f")  
fmt.Println(s) // [a b c d e f]  
  
c := make([]string, len(s))  
copy(c, s)  
fmt.Println(c) // [a b c d e f]  
  
fmt.Println(s[2:5]) // [c d e]  
fmt.Println(s[:5]) // [a b c d e]  
fmt.Println(s[2:]) // [c d e f]  
  
good := []string{"g", "o", "o", "d"}  
fmt.Println(good) // [g o o d]  
}

JSON处理

对于一个已有的结构体,我们可以什么都不做,只要保证第一个字母是大写,也就是公开字段,那么这个结构体就可以用JSON.marshaler去序列化,变成一个JSON字符串,序列化之后的字符串也能够用JSON/unmarshaler去反序列化到一个空的变量里面。这样默认序列化出来的字符串的话,它的风格是大写字母开头,而不是下划线,我们可以在后面用json tag等语法来去修改输出JSON结果里面的字段名

**json.Marshal 是一个 Go 语言标准库中的函数,用于将数据类型转换为 JSON 格式的字节数组。它的函数签名如下:

func Marshal(v interface{}) ([]byte, error)

参数 v 是要转换为 JSON 格式的数据,它必须是基本类型(如 bool、int、float、string)、结构体、数组或 slice。函数会返回一个包含 JSON 格式数据的字节数组和一个错误对象。如果转换成功,错误对象为 nil。 以下是一个例子,展示如何将一个结构体转换成 JSON 字节数组:

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}
p := Person{
    Name: "Alice",
    Age:  25,
}
b, err := json.Marshal(p)
if err != nil {
    log.Fatal(err)
}
fmt.Println(string(b)) // 输出: {"name":"Alice","age":25}

在这个例子中,我们定义了一个名为 Person 的结构体,并为其两个字段定义了 JSON 格式的属性名。然后,我们创建一个 Person 的实例 p,并将其转换为 JSON 格式的字节数组 b,最后将其打印出来。**

package main  
  
import (  
"encoding/json"  
"fmt"  
)  
  
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(buf) // [123 34 78 97...]  
fmt.Println(string(buf)) // {"Name":"wang","age":18,"Hobby":["Golang","TypeScript"]}  
  
buf, err = json.MarshalIndent(a, "", "\t")  
if err != nil {  
panic(err)  
}  
fmt.Println(string(buf))  
  
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:[]string{"Golang", "TypeScript"}}  
}