Go语言入门实践(下) | 青训营

48 阅读3分钟

本文假定读者有其他高级编程语言的基础,重点突出Go语言与其他编程语言使用上的区别。

  1. 结构体/结构体方法
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
}
  1. 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语句来确保在函数返回之前关闭文件。

  1. 错误处理
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)
	}
}
  1. 字符串操作(类似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
}
  1. 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"}}
}

  1. 数字解析
 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语言知识庞杂,期待本文能够给你一个引入的视角快速入门!