Skip to content

Commit

Permalink
增加go
Browse files Browse the repository at this point in the history
  • Loading branch information
tedjmzhang committed Jul 7, 2024
1 parent a7b88ed commit b7c7c2b
Show file tree
Hide file tree
Showing 10 changed files with 221 additions and 0 deletions.
3 changes: 3 additions & 0 deletions src/backend/go/greetings/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module example.com/greetings

go 1.20
30 changes: 30 additions & 0 deletions src/backend/go/greetings/greeting_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*
* @Author: tedjmzhang [email protected]
* @Date: 2024-07-06 16:08:07
* @LastEditors: tedjmzhang [email protected]
* @LastEditTime: 2024-07-06 16:15:03
* @FilePath: /webpack-org/blog/src/backend/go/greetings/greeting_test.go
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
package greetings

import (
"regexp"
"testing"
)

func TestHelloName(t *testing.T) {
name := "Gladys"
want := regexp.MustCompile(`\b` + name + `\b`)
msg, err := Hello("Gladys")
if !want.MatchString(msg) || err != nil {
t.Fatalf(`Hello("Gladys) = %q, %v, want match for %#q, nil`, msg, err, want)
}
}

func TestHelloEmpty(t *testing.T) {
msg, err := Hello("")
if msg != "" || err == nil {
t.Fatalf(`Hello("") = %q, %v, want "", error`, msg, err)
}
}
47 changes: 47 additions & 0 deletions src/backend/go/greetings/grettings.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
/*
* @Author: tedjmzhang [email protected]
* @Date: 2024-07-06 15:18:55
* @LastEditors: tedjmzhang [email protected]
* @LastEditTime: 2024-07-06 16:17:31
* @FilePath: /webpack-org/blog/src/backend/go/greetings/grettings.go
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
package greetings

import (
"errors"
"fmt"
"math/rand"
)

func Hello(name string) (string, error) {
if name == "" {
return "", errors.New("empty name")
}
message := fmt.Sprintf(randomFormat(), name)
// message := fmt.Sprint(randomFormat())
return message, nil
}

func randomFormat() string {
formats := []string{
"HI, %v. Welcome",
"Great to see you, %v!",
"Hail, %v! Well met!",
}
return formats[rand.Intn(len(formats))]
}

func Hellos(names []string) (map[string]string, error) {
messages := make(map[string]string)

for _, name := range names {
message, err := Hello(name)
if err != nil {
return nil, err
}
messages[name] = message
}

return messages, nil
}
7 changes: 7 additions & 0 deletions src/backend/go/hello/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
module example/hello

go 1.20

require example.com/greetings v0.0.0-00010101000000-000000000000

replace example.com/greetings => ../greetings
Empty file added src/backend/go/hello/go.sum
Empty file.
Binary file added src/backend/go/hello/hello
Binary file not shown.
28 changes: 28 additions & 0 deletions src/backend/go/hello/hello.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/*
* @Author: tedjmzhang [email protected]
* @Date: 2024-07-06 00:09:37
* @LastEditors: tedjmzhang [email protected]
* @LastEditTime: 2024-07-06 16:03:21
* @FilePath: /webpack-org/blog/src/backend/go/hello/hello.go
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
package main

import (
"fmt"
"log"

"example.com/greetings"
)

func main() {
log.SetPrefix("greetings: ")
log.SetFlags(0)

names := []string{"Gladys", "Samantha", "Darrin"}
messages, err := greetings.Hellos(names)
if err != nil {
log.Fatal((err))
}
fmt.Println(messages)
}
80 changes: 80 additions & 0 deletions src/backend/go/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
<!--
* @Author: tedjmzhang [email protected]
* @Date: 2024-07-06 00:05:53
* @LastEditors: tedjmzhang [email protected]
* @LastEditTime: 2024-07-06 16:57:43
* @FilePath: /webpack-org/blog/src/backend/go/index.md
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
-->
go

- 流程大概
1. 使用`go mod init example/hello`创建module,命令会创建一个go.mod文件,文件包含包module名称
``` go
// go.mod
module example/hello

go 1.20
```

2. 编写`hello.go`文件,`go run .`会执行该目录下面的所有文件的package为main的函数
```
package main

import (
"fmt"
"log"

"example.com/greetings"
)

func main() {
log.SetPrefix("greetings: ")
log.SetFlags(0)

names := []string{"Gladys", "Samantha", "Darrin"}
messages, err := greetings.Hellos(names)
if err != nil {
log.Fatal((err))
}
fmt.Println(messages)
}

```

3. 编写另外一个module,名为`example.com/greetings`,操作如上,该module有Hello和Hellos两个方法(方法首字母大写表示可由其他module调用,否则只能自己内部调用)

4. 使用`go mod edit -replace example.com/greetings=../greetings`命令替换使用本地模块,不然会去pkg.go.dev下载远程已经发布的模块。运行完成之后hello/go.mod会改变
```
// +++
replace example.com/greetings => ../greetings
```

5. 执行`go mod tidy`,会自动整理代码里面所有依赖,反应到go.mod文件中
```
// +++
require example.com/greetings v0.0.0-00010101000000-000000000000
```

6. 执行`go run .`会执行该main方法

7. 执行`go build`会在当前目录生成hello的二进制文件,可通过命令行`./hello`运行代码

8. 执行`go install`会将hello文件生成到由`go list -f '{{.Target}}'`返回的目录之中,通过将该目录暴露到PATH,可以在全局直接`hello`执行该二进制程序

- 一些语法知识
1. message := fmt.Sprintf("Hi, %v. Welcome!", name)
表示缩写,意思同以下
var message string
message = fmt.Sprintf("Hi, %v. Welcome!", name)
2. messages, err := greetings.Hellos(names)
表示greetings.Hellos函数返回两个值,一个值为message,一个为err
3. names := []string{"Gladys", "Samantha", "Darrin"}
表示names为一个slice(类似js的数组),有三个值,都是为string
4. messages := make(map[string]int)
表示messages为一个map(类似js的mapmap的key为string和value为int,通过messages[key] = value来添加
5. for _, name := range names {...}
表示一个for循环,range返回两个值,index和item,如果不需要使用index,则可以使用_来优化代码

- 测试 go test
会执行该目录下,以_test.go结尾的程序。
3 changes: 3 additions & 0 deletions src/backend/go/test/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module test

go 1.20
23 changes: 23 additions & 0 deletions src/backend/go/test/test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/*
* @Author: tedjmzhang [email protected]
* @Date: 2024-07-06 17:12:13
* @LastEditors: tedjmzhang [email protected]
* @LastEditTime: 2024-07-06 17:12:40
* @FilePath: /webpack-org/blog/src/backend/go/test/test.go
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
package main

import "fmt"

func main() {
i, j := 42, 2701

p := &i // 指向 i
fmt.Println(*p) // 通过指针读取 i 的值
*p = 21 // 通过指针设置 i 的值
fmt.Println(i) // 查看 i 的值

p = &j // 指向 j
*p = *p / 37 // 通过指针对 j 进行除法运算
fmt.Println(j) // 查看 j 的值

0 comments on commit b7c7c2b

Please sign in to comment.