本文假定读者有其他高级编程语言的基础,重点突出Go语言与其他编程语言使用上的区别。
- 结构体/结构体方法
package main
import "fmt"
type user struct {
name string
password string
}
func main() {
a := user{name: "wang", password: "1024"}
b := user{"wang", "1024"}
c := user{name: "wang"}
c.password = "1024"
var d user
d.name = "wang"
d.password = "1024"
fmt.Println(a, b, c, d) // {wang 1024} {wang 1024} {wang 1024} {wang 1024}
fmt.Println(checkPassword(a, "haha")) // false
fmt.Println(checkPassword2(&a, "haha")) // false
fmt.Println(d.checkPassword("1024"))
d.resetPassword("6789")
fmt.Println(d.password)
}
func checkPassword(u user, password string) bool {
return u.password == password
}
func checkPassword2(u *user, password string) bool { //对结构体进行修改,避免大结构体拷贝开销
return u.password == password
}
func (u user) checkPassword(password string) bool {
return u.password == password
}
func (u *user) resetPassword(password string) {
u.password = password
}
- defer关键字
用于在函数返回之前执行一些代码。defer语句可以被放置在函数中的任何位置,并且可以有多个defer语句。当函数返回时,所有的defer语句都会被执行,按照后进先出(LIFO)的顺序执行。
defer语句通常用于确保在函数执行完毕后释放资源,例如关闭文件或解锁资源。defer语句还可以用于捕获和处理异常。
以下是一个使用defer的示例代码:
func readFile(filename string) ([]byte, error) {
f, err := os.Open(filename)
if err != nil {
return nil, err
}
defer f.Close()
return ioutil.ReadAll(f)
}
在这个示例中,我们打开一个文件并读取它的内容。如果打开文件时发生错误,则返回错误。否则,我们使用defer语句来确保在函数返回之前关闭文件。
- 错误处理
package main
import (
"errors"
"fmt"
)
type user struct {
name string
password string
}
func findUser(users []user, name string) (v *user, err error) {
for _, u := range users {
if u.name == name {
return &u, nil
}
}
return nil, errors.New("not found")
}
func main() {
u, err := findUser([]user{{"wang", "1024"}}, "wang")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(u.name) // wang
if u, err := findUser([]user{{"wang", "1024"}}, "li"); err != nil {
fmt.Println(err) // not found
return
} else {
fmt.Println(u.name)
}
}
- 字符串操作(类似C语言printf,但更加易用)
package main
import (
"fmt"
"strings"
)
type point struct {
x, y int
}
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
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
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
s := "hello"
n := 123
p := point{}
p.x = 1
p.y = 2 // identical to-> p := point{1, 2}
fmt.Println(p)
fmt.Println(s, n) // hello 123
fmt.Println(p) // {1 2}
fmt.Printf("s=%v\n", s) // s=hello
fmt.Printf("n=%v\n", n) // n=123
fmt.Printf("p=%v\n", p) // p={1 2}
// more details
fmt.Printf("p=%+v\n", p) // p={x:1 y:2}
fmt.Printf("p=%#v\n", p) // p=main.point{x:1, y:2}
f := 3.141592653
fmt.Println(f) // 3.141592653
fmt.Printf("%.2f\n", f) // 3.14
}
- JSON处理
package main
import (
"encoding/json"
"fmt"
)
type userInfo struct {
Name string
Age int `json:"age"` //此处表示序列化出来的json用age代替掉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) //deserialize
if err != nil {
panic(err)
}
fmt.Printf("%#v\n", b) // main.userInfo{Name:"wang", Age:18, Hobby:[]string{"Golang", "TypeScript"}}
}
- 数字解析
package main
import (
"fmt"
"strconv" // string convert, string <-> number
)
func main() {
//(num string, base(if 0 is passed here, parse automatically), 64-bit precision)
f, _ := strconv.ParseFloat("1.234", 64)
fmt.Println(f) // 1.234
n, _ := strconv.ParseInt("111", 10, 64)
fmt.Println(n) // 111
n, _ = strconv.ParseInt("0x1000", 0, 64)
fmt.Println(n) // 4096
n1 := strconv.Itoa(123)// int to string
fmt.Println(n1) // 123
n2, err := strconv.Atoi("123")
fmt.Println(n2, err)
//n2, err := strconv.Atoi("AAA")
//fmt.Println(n2, err) // 0 strconv.Atoi: parsing "AAA": invalid syntax
}
以上为Go语言的基本入门实践,Go语言知识庞杂,期待本文能够给你一个引入的视角快速入门!