Go语言基础第一章
- 变量声明
var v1 int
var v2 string
var v3 [10]int #array
var v4 []int #array slice
var v5 struct{
f int
}
var v6 *int
var v7 map[string]int
var v8 func(a int) int
避免重复,可以将声明放在一起
var (
v1 int
v2 string
)
- 变量初始化
Go可以初始化右侧推导出该变量应该初始化成那种类型
var v1 int = 10
var v2 = 10
v3 := 10
- 常量定义 const
const Pi float64 = 3.141592653589323846
package main
import (
"fmt"
"math/cmplx"
)
func modify(array [5]int) {
array[0] = 10
fmt.Println("in modify(), array values:", array)
}
func main() {
// 复数类型, 可以通过内置函数real(), imag()获得实部和虚部,还可以通过cmplx获得更多用法
v1 := complex(3.2, 12)
fmt.Println(cmplx.Abs(v1))
fmt.Println(real(v1))
fmt.Println(imag(v1))
//字符串, go中字符串也是一种基本类型
//Printf才支持%式的输出, Println不支持
var str string
str = "Hello world"
ch := str[0]
fmt.Printf("the length of %s is %d \n", str, len(str))
fmt.Printf("the first character of \"%s\" is %c \n", str, ch)
//字符串遍历
str1 := "Hello, 世界"
n := len(str1)
for i := 0; i < n; i++ {
ch := str1[i] //ch类型为byte
fmt.Println(i, ch)
}
for i, ch := range str1 {
fmt.Println(i, ch) //ch类型为rune
}
//数组,
// 1值类型: 所有的值类型变量在赋值和作为参数传递时都将产生一次复制动作。如果将数组作为函数的参数类型,
// 则在函数调用时该 参数将发生数据复制。因此,在函数体中无法修改传入的数组的内容,因为函数内操作的只是所 传入数组的一个副本。
array := [5]int{1, 2, 3, 4, 5}
modify(array)
fmt.Println("in main(), array values:", array)
//2.数组切片slice
// go中数组的长度定义后无法修改, 数组是值类型, 每次传递都产生一个副本, 使用slice来祢补不足
var myArray [10]int = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
var mySlice []int = myArray[:5] //基于数组创建切片
mySlice1 := make([]int, 5) //初始元素个数为5个的切片
mySlice2 := make([]int, 5, 10) //5个元素,初始为0, 并预留10个元素的空间
mySlice3 := []int{1, 2, 3, 4, 5} //直接创建并初始化
fmt.Println(mySlice1)
fmt.Println(mySlice2)
fmt.Println(mySlice3)
fmt.Println("myAarray: ")
for _, v := range myArray {
fmt.Print(v, " ")
}
fmt.Println("\nmySlice: ")
for _, v := range mySlice {
fmt.Print(v, " ")
}
fmt.Println()
// 动态增减元素
// 数组切片支持go内置的cap():返回切片分配的空间大小,和len(): 返回当前所存储的元素个数
mySlice4 := make([]int, 5, 10)
fmt.Println("len of slice:", len(mySlice4))
fmt.Println("len of slice:", cap(mySlice4))
mySlice4 = append(mySlice4, 1, 2, 3)
fmt.Println("len of slice:", len(mySlice4))
fmt.Println("len of slice:", cap(mySlice4))
mySlice4 = append(mySlice4, 1, 2, 3) //元算个数超出预留空间的时候,会自动扩容
fmt.Println("len of slice:", len(mySlice4))
fmt.Println("len of slice:", cap(mySlice4))
// 内容复制
// 数组切片支持Go语言的内置函数copy(), 按照较小的数组切片的元素个数进行复制
mySlice5 := []int{1, 2, 3, 4, 5}
mySlice6 := []int{5, 4, 3}
copy(mySlice6, mySlice5) //copy(to, from), 复制mySlice5的前3个元素到mySlice6
fmt.Println(mySlice6)
fmt.Println(mySlice5)
// [1 2 3]
// [1 2 3 4 5]
}
package main
import (
"fmt"
)
type PersonInfo struct {
ID string
Name string
Address string
}
func main() {
// var personDB map[string]PersonInfo
// personDB = make(map[string]PersonInfo)
personDB := make(map[string]PersonInfo)
// 添加
personDB["0"] = PersonInfo{"0", "Jack", "Room 201"}
personDB["1"] = PersonInfo{"1", "Tom", "Room 203"}
// 查找
// 不需要检查取到的值是否为nil, 只需查看第二个返回值ok
person, ok := personDB["1"]
if ok {
fmt.Println("Found Person", person.Name, "with ID 1")
// 使用Go内置函数delete可以删除map内的元素
delete(personDB, "1")
_, ok := personDB["1"]
if !ok {
fmt.Println("Person delete success!")
}
} else {
fmt.Println("Did not find person with ID 1")
}
}