1.官网下载goland-2022.2.5.dmg版本(Mac)版本。如果是windows版本也可以直接下载)
2.配置gopath,基本都是配置.我这里配置为/usr/local/go 作为全目录,如果是windows,直接在环境中配置path路径就好。
3.查看版本 go version
go version
go version go1.19.3 darwin/amd64
建立工作目录gowork
基本目录结构为gowork/hello
gowork/greetings 2个目录文件
目录结构为:
package mainimport ("fmt""example.com/greetings"
)func main() {// Get a greeting message and print it.message := greetings.Hello("XiaMenKeny")fmt.Println(message)
}
保存的时候,会提示错误。因为里面有调用example.com/greetings的引用包
package mainimport ("fmt""example.com/greetings"
)func main() {// Get a greeting message and print it.message := greetings.Hello("XiaMenKeny")fmt.Println(message)
}
分别建立2个文件。这个时候再进行会提示找不到
example.com/hello
module to use your local example.com/greetings
需要在原先环境下编辑一下mod,用命令,实际是修改到本地的目录文件上
go mod edit -replace example.com/greetings=../greetings
打开看go.mod 就可以看到已经变为,说明已经修改到本地目录上的
module example.com/hellogo 1.19require (example.com/greetings v0.0.0-00010101000000-000000000000github.com/isdamir/gotype v0.0.0-20200101084212-6aa1591106b2rsc.io/quote v1.5.2
)require (golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c // indirectrsc.io/sampler v1.3.0 // indirect
)replace example.com/greetings => ../greetings
go run hello.go
Hi, XiaMenKeny. Welcome by keny16999 from Beijing !
说明hello.go 已经调用了greetings.go里面的Hello方法。传输的参数是字符串
hello.go 修改带2参数的判断error
package mainimport ("fmt""log""example.com/greetings"
)func main() {// Get a greeting message and print it.log.SetPrefix("greetings: ")log.SetFlags(0)// Request a greeting message.message, err := greetings.Hello("")// If an error was returned, print it to the console and// exit the program.if err != nil {log.Fatal(err)}//greetings.Hello("XiaMenKeny")fmt.Println(message)
}
G
我们可以直接运行这里直接传入一个空串,查看是否有错误出现,正确返回错误信息,
go run hello.go
greetings: empty name
exit status 1
package greetingsimport ("errors""fmt""math/rand""time"
)// Hello returns a greeting for the named person.
func Hello(name string) (string, error) {// If no name was given, return an error with a message.if name == "" {return name, errors.New("empty name")}// Create a message using a random format.message := fmt.Sprintf(randomFormat(), name)return message, nil
}// init sets initial values for variables used in the function.
func init() {rand.Seed(time.Now().UnixNano())
}// randomFormat returns one of a set of greeting messages. The returned
// message is selected at random.
func randomFormat() string {// A slice of message formats.formats := []string{"Hi, %v. Welcome by keny16999 from Beijing !","Great to see you, %v!","Hail, %v! Well met!",}// Return a randomly selected message format by specifying// a random index for the slice of formats.return formats[rand.Intn(len(formats))]
}
修改hello.go
实践上代码是随机抽取字符串的3个字符串,代码比较简单,直接过就好。
#go run hello.go
Great to see you, Gladys!
#go run hello.go
Hi, kenyabc. Welcome by keny16999 from Beijing !
#go run hello.go
Hail, kenyabc! Well met!
继续修改greetings.go代码
package greetingsimport ("errors""fmt""math/rand""time"
)// Hello returns a greeting for the named person.
func Hello(name string) (string, error) {// If no name was given, return an error with a message.if name == "" {return name, errors.New("empty name")}// Create a message using a random format.message := fmt.Sprintf(randomFormat(), name)return message, nil
}// Hellos returns a map that associates each of the named people
// with a greeting message.
func Hellos(names []string) (map[string]string, error) {// A map to associate names with messages.messages := make(map[string]string)// Loop through the received slice of names, calling// the Hello function to get a message for each name.for _, name := range names {message, err := Hello(name)if err != nil {return nil, err}// In the map, associate the retrieved message with// the name.messages[name] = message}return messages, nil
}// Init sets initial values for variables used in the function.
func init() {rand.Seed(time.Now().UnixNano())
}// randomFormat returns one of a set of greeting messages. The returned
// message is selected at random.
func randomFormat() string {// A slice of message formats.formats := []string{"Hi, %v. Welcome!","Great to see you, %v!","Hail, %v! Well met!",}// Return one of the message formats selected at random.return formats[rand.Intn(len(formats))]
}
修改hello.go代码
package mainimport ("fmt""log""example.com/greetings"
)func main() {// Set properties of the predefined Logger, including// the log entry prefix and a flag to disable printing// the time, source file, and line number.log.SetPrefix("greetings: ")log.SetFlags(0)// A slice of names.names := []string{"机器猫", "多爱猫", "天猫"}// Request greeting messages for the names.messages, err := greetings.Hellos(names)if err != nil {log.Fatal(err)}// If no error was returned, print the returned map of// messages to the console.fmt.Println(messages)
}
go run hello.go
map[多爱猫:Hail, 多爱猫! Well met! 天猫:Hail, 天猫! Well met! 机器猫:Hi, 机器猫. Welcome!]
返回name多个参数,里面有3个全部返回
package greetingsimport ("testing""regexp"
)// TestHelloName calls greetings.Hello with a name, checking
// for a valid return value.
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)}
}// TestHelloEmpty calls greetings.Hello with an empty string,
// checking for an error.
func TestHelloEmpty(t *testing.T) {msg, err := Hello("")if msg != "" || err == nil {t.Fatalf(`Hello("") = %q, %v, want "", error`, msg, err)}
}
下面说明没有发现测试文件。需要查看一下目录
go test
? example.com/hello [no test files]
测试文件建立在greetings目录下,要在greetings目录下运行
go test -v
=== RUN TestHelloName
--- PASS: TestHelloName (0.00s)
=== RUN TestHelloEmpty
--- PASS: TestHelloEmpty (0.00s)
PASS
ok example.com/greetings 0.016s
说明空的参数也通过。
时间上要修改一下greetings.go代码,区别就是参数传递的时候,有个是空的,目的是测试一个空的函数是否提示正确
// message := fmt.Sprintf(randomFormat(), name)message := fmt.Sprint(randomFormat())
TestHelloNamegreetings_test.go:15: Hello("Gladys") = "Hi, %v. Welcome!", , want match for `\bGladys\b`, nil
--- FAIL: TestHelloName (0.00s)
明显是说明需要参数传递的。
$ go build
Mac和linux编译为hello执行文件,如果不可以执行,手工修改一下属性,变成可以执行的
$ go build./hello
map[Gladys:Hail, Gladys! Well met! 多爱猫:Hail, 多爱猫! Well met! 天猫:Hail, 天猫! Well met!]
把代码添加到你的gopath里面去,相当于部署到bin目录中 hello目录下输入go install 将hello新编译的文件已经注册到新的目录去。