Go基础语法|青训营

67 阅读3分钟

函数

Go中采用后置返回值的声明方式进行函数的构造,如果要返回多个值,可采用”()“的方式蒋返回类型进行声明,对于返回的变量声明也可以放在括号中,如下所示: 注意 函数无法进行重载

package main
import "fmt"
func add(a int, b int) int {
	return a + b
}
func add2(a, b int) int {
	return a + b
}
func exists(m map[string]string, k string) (v string, ok bool) {
	v, ok = m[k]
	return v, ok
}
func main() {
	res := add(1, 2)
	fmt.Println(res)
	res2 := add2(3, 2)
	fmt.Println(res2)
	v, ok := exists(map[string]string{"a": "A"}, "a")
	fmt.Println(v, ok)
}
复制代码

指针

Go语言中也支持指针操作,但并不能向C++一样运用的如此广泛,它可以用来真实的改变值本身的大小,而非发生拷贝操作后无法对初始值进行改变,即值传递和引用传递区别本身,传递本身也采用地址符号进行传递

结构体,类

Go中的结构体同C中的结构体很像,在定义过程中,可以有几种不同的方式进行定义,相对而言比较灵活,可以指定需要定义的成员值

成员函数的定义只需要在”func“后用括号表明这是谁的成员函数即可

strings

同C++类似,可以实现对字符串的查询,追加,拼接,分割,重复使用,等等

package main

import (
	"fmt"
	"strings"
)

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
}
复制代码

fmt 格式化输出

同C语言的printf很像,但对于不同的数据类型,Go均可通过%v实现输出, %+v 表示详细输出 %#v表示更加详细的输出,包括调用的函数

json相关

对于一个已有的结构体,保证每个字段的第一个字母为大写,那么这个结构体可以通过Json.Marshal进行序列化,序列化为一个数组的形式,需要通过通过string强制类型转换才能打印出字符串 通过json.MarshalIndent可以实现json格式的buf

时间相关函数

Go语言中通过包含time来实现相应接口访问,在时间处理上很灵活,可以定义各种类型的时间输出形式,通过也可以调用时间戳,计算时间差以及定义一个自定义类型的时间格式,来实现时间的访问

字符串和数字之间的转换

通过调用strconv实现字符串与数字之间的有效访问

实战案例之猜谜游戏

这个例子可以熟练的掌握Go语言的基本语法,主要通过bufio.NewReader(os.Stdin)获得用户输入的字符,由于其中含有换行符需要通过strings剔除换行符,通过for循环判断用户输入值与随机产生值之间的比较,需要通过rand.Seed(time.Now().UnixNano())设置随机数种子

package main
import (
	"bufio"
	"fmt"
	"math/rand"
	"os"
	"strconv"
	"strings"
	"time"
)
func main() {
	maxNum := 100
	rand.Seed(time.Now().UnixNano())
	secretNumber := rand.Intn(maxNum)
	fmt.Println("The sercert number is ", secretNumber)
	for {
		fmt.Println("Please input your guess")
		reader := bufio.NewReader(os.Stdin)
		input, err := reader.ReadString('\n')
		if err != nil {
			fmt.Println("An error occured while reading input Please try again", err)
			continue
		}
		input = strings.Trim(input, "\r\n")
		guess, err := strconv.Atoi(input)
		if err != nil {
			fmt.Println("Invalid input,Please enter an integer value")
			continue
		}
		fmt.Println("You guess is:", guess)
		if guess > secretNumber {
			fmt.Println("Your guess is bigger than the secret number. Please try again")
		} else if guess < secretNumber {
			fmt.Println("Your guess is smaller than the secret number. Please try again")
		} else {
			fmt.Println("Correct,you Legend!")
			break
		}
	}

}