1 配置环境
配置完成后写hello world,出现
Build Error: go build -o e:\go\projects\src\first__debug_bin407375910.exe -gcflags all=-N -l . go: go.mod file not found in current directory or any parent directory; see 'go help modules' (exit status 1)
解决一:命令行:go mod init first
失败
解决二:在vscode的命令行输入
成功
2 基础语法
2.1 变量
var name type =value
name := value
const name type =value
2.2 if else
没有小括号
2.3循环
只有for循环
2.4 Switch
Switch后没有小括号
默认不写break
常用来替代多个if else
2.5 数组和切片
数组长度不可变,不常用
切边长度可变
语法:
s :=make([]string,3)
s=append(s,”d”)
fmt.Println(s[2:3])//起始处和终点处
c :=make([]string,len(s))
copy(c,s)
good :=[]string{"g","o","o","d"}
2.6 map
m :=make(map[string]int)
m["one"]=1
delete(m,"one")
r,ok:=m["two"];//r获取对应值,OK获取是否存在的布尔值
m2:=map[string]int{"one":1,"two":2}
var m3 =map[string]int{"one":1,"two":2}
2.7 range
range 关键字用于 for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。在数组和切片中它返回元素的索引和索引对应的值,在集合中返回 key-value 对。
package main
import "fmt"
var pow = []int{1, 2, 4, 8, 16, 32, 64, 128}
func main() {
for i, v := range pow {
fmt.Printf("2**%d = %d\n", i, v)
}
}
2.8 函数
func function_name( [parameter list] ) [return_types] {
函数体
}
2.9 指针
func add2(n *int){
*n+=2;
}
func main(){
n:=5;
add2(&n);//n=7
}
2.10 结构体
package main
import "fmt"
type Books struct {
title string
author string
subject string
book_id int
}
func main() {
var Book1 Books /* 声明 Book1 为 Books 类型 */
Book2:=Books{title:"xxx",anthor:"xxx"}
Book3:=Books{"xxx","xxx"}
/* book 1 描述 */
Book1.title = "Go 语言"
Book1.author = "www.runoob.com"
Book1.subject = "Go 语言教程"
Book1.book_id = 6495407
}
2.11 错误处理
result, err:= Sqrt(-1)
if err != nil {
fmt.Println(err)
}
2.12 json
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"}}
}
2.13 时间处理
package main
import (
"fmt"
"time"
)
func main() {
now := time.Now()
fmt.Println(now) // 2022-03-27 18:04:59.433297 +0800 CST m=+0.000087933
t := time.Date(2022, 3, 27, 1, 25, 36, 0, time.UTC)
t2 := time.Date(2022, 3, 27, 2, 30, 36, 0, time.UTC)
fmt.Println(t) // 2022-03-27 01:25:36 +0000 UTC
fmt.Println(t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute()) // 2022 March 27 1 25
fmt.Println(t.Format("2006-01-02 15:04:05")) // 2022-03-27 01:25:36
diff := t2.Sub(t)
fmt.Println(diff) // 1h5m0s
fmt.Println(diff.Minutes(), diff.Seconds()) // 65 3900
t3, err := time.Parse("2006-01-02 15:04:05", "2022-03-27 01:25:36")
if err != nil {
panic(err)
}
fmt.Println(t3 == t) // true
fmt.Println(now.Unix()) // 1648738080
}
3 实战案例
猜数字报错:
Unable to process evaluate: debuggee is running
解决方案一 修改launch.json
"console": "integratedTerminal"
失败
解决方案二 在vscode终端用命令行运行go
go run guessNum.go
3.1 读入数据
reader := bufio.NewReader(os.Stdin)
input, err := reader.ReadString('\n') //读取一行
if err != nil {
fmt.Println("error:", err)
return
}
input = strings.TrimSuffix(input, "\n") //去掉换行符
input = strings.TrimSuffix(input, "\r") //去掉回车
guess, err := strconv.Atoi(input)
if err != nil {
fmt.Println("error:", err)
return
}
fmt.Println("your guess is:", guess)