1.1 helloworld
package main
import (
"fmt"
)
func main() {
fmt.Println("hello world")
}
- 这段是最简单的hello world,主要的运行原理是:go语言的代码块通过包(package)组织,一个包由单个或多个目录下的*.go源文件* 组成,这个hello world里的包就是main,同时导入了“fmt”标准库。同时go也提供多种标准库,常见的输入输出,排序都包含。
- main定义了一个独立可执行程序,它是整个程序的入口。函数所做的就算程序所做的。在package后面必须用import告诉程序需要导入哪个包。
- go也对格式有着严格的要求。gofmt可以把代码格式化为标准格式。
1.2 go语言的特点
- 高性能,高并发
- 丰富的标准库
- 完善的工具链
- 静态链接
- 快速编译
- 跨平台
- 垃圾回收
1.3 变量类型
func main() {
var a = "initial"
var b, c int = 1, 2
var d = true
var e float64
f := float32(e)
g := a + "foo" //因为字符串是内置类型,所以可以直接通过+拼接
fmt.Println(a, b, c, d, e, f) // initial 1 2 true 0 0
fmt.Println(g) // initialapple
const s string = "constant"
const h = 500000000
const i = 3e20 / h
fmt.Println(s, h, i, math.Sin(h), math.Sin(i)) //constant 500000000 6e+11 -0.28470407323754404 0.7591864109375384
}
变量的两种声明方式①var 变量名 = xxx,会自动根据上下文识别变量类型。②变量名 := 值。常量的声明只要将var改成const即可。
1.4 if/else
func main() {
if 7%2 == 0 {
fmt.Println("7 is even")
} else {
fmt.Println("7 is odd")
}
}
不用像其它语言一样在if后面给条件加(),即使加上()在保存时编辑器也会自动取消掉。
1.5 切片
func main() {
s := make([]string, 3) //使用make创建长度为3的字符串数组
s[0] = "a"
s[1] = "b"
s[2] = "c"
fmt.Println("get:", s[2]) // c
fmt.Println("len:", len(s)) // 3
s = append(s, "d") //append添加扩容
s = append(s, "e", "f")
fmt.Println(s) // [a b c d e f]
c := make([]string, len(s))
copy(c, s)
fmt.Println(c) // [a b c d e f]
fmt.Println(s[2:5]) // 切片输出第二个到第4个元素,输出[c d e]
fmt.Println(s[:5]) // 输出5以前元素,[a b c d e]
fmt.Println(s[2:]) // 输出2以后的元素[c d e f]
good := []string{"g", "o", "o", "d"}
fmt.Println(good) // [g o o d]
}
1.6 map
import "fmt"
func add2(n int) { //一个给n加2的函数,但是是无效的,因为是一个拷贝函数
n += 2
}
func add2ptr(n *int) { //正确写法,要传入指针类型,且在调用时给里面填入值时候要加一个&符号才可用正确调用
*n += 2
}
func main() {
n := 5
add2(n)
fmt.Println(n) // 5
add2ptr(&n) //调用函数时需要加&才可用正确调用
fmt.Println(n) // 7
}
1.7 字符串操作
func main() {
a := "hello"
fmt.Println(strings.Contains(a, "ll")) // a中是否包含“ll”,输出true
fmt.Println(strings.Count(a, "l")) // a中的“l”有多少个,输出2
fmt.Println(strings.HasPrefix(a, "he")) // a的前置是否是“he”,输出true
fmt.Println(strings.HasSuffix(a, "llo")) // a的最后是否是“llo”,输出true
fmt.Println(strings.Index(a, "ll")) // 2
fmt.Println(strings.Join([]string{"he", "llo"}, "-")) // 在he和llo字符中间加入“-”he-llo
}
2.1 练习1-猜谜游戏
import (
"bufio"
"fmt"
"math/rand"
"os"
"strconv"
"strings"
"time" //首先需要导入可能用到的库
)
func main() {
maxNum := 100 //先将最大的数字定义为100,所猜想的数字不能超过100
rand.Seed(time.Now().UnixNano())
secretNumber := rand.Intn(maxNum) //利用随机数生成一个在最大数100范围内的随机数
fmt.Println("Please input your guess")
reader := bufio.NewReader(os.Stdin)
for {
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
}
}
}