基础语法入门
helloworld程序
package main
import (
"fmt"
)
func main() {
fmt.Println("helloworld")
}
运行程序命令:
go run helloworld.go
编译程序:生成可执行文件
go build helloworld.go
基础语法
基础数据类型
复合数据类型
数组
定义格式:
var a [5]int
b := [5]int{1,2,3,4,5}
//二维数组
var twoD[2][3]
切片
s := make([]String, 3)
s[0] = "a"
s[1] = "b"
s[2] = "c"
切片不同于数组可以任意更改长度。比如说我们可以用make来创建一个切片,可以像数组一样去取值,使用append 来追加元素。
注意append的用法的话,你必须把append 的结果赋值为原数组。
因为 slice的原理实际上是它有一个它存储了一个长度和一个容量,加一个指向一个数组的指升,在你执行 append操作的时候,如果容量不够的话,会扩容并且返回新的 slice,slice 此初始化的时候也可以指定长度。
slice 拥有像python一样的切片操作,可以取出任意区间位置的元素,不包括第五个元素。不同于python,这里不支持负数索引
map
哈希表是一种巧妙并且实用的数据结构。它是一个无序的key/value对的集合,其中所有的key都是不同的,然后通过给定的key可以在常数时间复杂度内检索、更新或删除对应的value。
//格式
map[K]V
//创建map
ages := make(ages[string]int)
ages["alice"] = 31
ages["charlie"] = 34
//或者是
ages := make(ages[string]int){
"alice" : 31,
"charlie": 34,
}
//访问map
fmt.print(ages["alice"])
//删除
delete(ages, "alice") // remove element ages["alice"]
//操作value
ages["bob"]++;
//遍历map
for name,age := range ages{
fmt.print("%s\t%d",name,age)
}//map的迭代顺序随机。
- K的要求:满足可以==比较的条件
- 无法取址:元素不是变量,不能取址
变量
go语言是强类型语言。
正常声明变量的方法:
var 变量名字 类型 = 表达式
var i, j, k int // int, int, int
var b, f, s = true, 2.3, "four" // bool, float64, string
其中“类型”或“= 表达式”两个部分可以省略其中的一个。
- 省略类型:根据初始化表达式来推导变量的类型信息。
- 省略表达式:用零值初始化该变量。
简短声明:
名字 := 表达式
单个:
i := 100
一组:
i, j := 0, 1
注意:
“:=”是一个变量声明语句,而“=”是一个变量赋值操作。
常量
由const定义。
指针
go的指针操作有限。
对传参进行修改
//对变量进行 +1操作
func add1(n int ) {
n += 1
}//不起作用
func add1ptr(n *int) {//指向一个int类型的指针
*n += 1
}//操作实际地址的变量,行得通
func main() {
n := 1
add1(n)
fmt.print(n)//1
add1ptr(n)
fmt.print(n)//2
}
函数
类型后置是go语法的一个特征:
func add(a int, b int) int {
return a + b
}
func add(a,b int) int{
return a + b
}
go的原生函数支持函数返回2个值,第一个值是真正的结果,第二个值一般是业务逻辑的错误信息。
func exist(m map[string]string, k string) v string, ok bool{
v, ok = m[k]
return v, ok
}
程序控制语句
条件分支
if else:
if 条件 {
执行逻辑
}else if 条件{
}else{
}
后面括号可省略、但是后面必须跟同行大括号。
switch:
go的switch语句case后面可以跟任何条件
switch [变量or常量]{
case t.hour() < 12:
//
default:
//
}
这里不需要写break,不同于c/c++,go的switch是指哪打哪,不会继续往下走。
循环控制
go语言里仅有for循环,条件不用再加括号,同行 大括号必备。
for {
}
i := 1
for j := 7 ; j < 9; j++ {
fmt.print(i);
}
案例
随机数——猜数字案例
import (
"bufio"
"fmt"
"math/rand"
"os"
"strconv"
"strings"
)
func main() {
maxNUm := 100
secretNum := rand.Intn(maxNUm)
fmt.Println("Please input your guess")
reader := bufio.NewReader(os.Stdin)
for {
input, err := reader.ReadString('\n')
if err != nil {
fmt.Println("err!!!")
continue
}
input = strings.TrimSuffix(input, "\r\n")
guess, err1 := strconv.Atoi(input)
if err1 != nil {
fmt.Println("input err!", err1)
continue
}
fmt.Println("your guess is ", guess)
if guess > secretNum {
fmt.Println("big!")
} else if guess < secretNum {
fmt.Println("little!")
} else {
fmt.Println("yes")
break
}
}
}