// test002 project main.go
package main
import (
"fmt"
)
//一个结构体(`struct`)就是一个字段的集合。(而 type 的含义跟其字面意思相符。)
type Vertex struct {
X int
Y int
}
/*
结构体文法表示通过结构体字段的值作为列表来新分配一个结构体。
使用 Name: 语法可以仅列出部分字段。(字段名的顺序无关。)
特殊的前缀 & 返回一个指向结构体的指针。
*/
var (
v1 = Vertex{1, 2} // 类型为 Vertex
v2 = Vertex{X: 1} // Y:0 被省略
v3 = Vertex{Y: 2} // Y:0 被省略
v4 = Vertex{} // X:0 和 Y:0
v5 = &Vertex{1, 2} // 类型为 *Vertex
)
func main() {
//1、指针操作
i, j := 2, 4
fmt.Println(i, j)
//& 符号会生成一个指向其作用对象的指针。
p := &i //point to i
fmt.Println(p, *p) //通过指针p读取i,输出p指针地址及指针指向底层的值
//* 符号表示指针指向的底层的值。
*p = 5 // 通过指针p设置 i
fmt.Println(p, i)
p = &j // point to j
*p = *p / 2 // divide j through the pointer
fmt.Println(p, j) // see the new value of j
//2、结构体操作
fmt.Println(Vertex{1, 2}) //输出{1 2}
v := Vertex{3, 4}
//结构体字段使用点号来访问。
v.X = 5
fmt.Println(v.X) //输出5
//结构体指针 结构体字段可以通过结构体指针来访问。通过指针间接的访问是透明的。
p1 := &v
p1.Y = 6
fmt.Println(v, p1.X) //输出{5 6} 5
fmt.Println(v1, v2, v3, v4, v5) //输出 {1 2} {1 0} {0 2} {0 0} &{1 2}
// 3、数组操作
/*
类型 [n]T 是一个有 n 个类型为 T 的值的数组。
表达式
var a [10]int
定义变量 a 是一个有十个整数的数组。
数组的长度是其类型的一部分,因此数组不能改变大小。 这看起来是一个制约,但是请不要担心; Go 提供了更加便利的方式来使用数组。
*/
var a [10]string
a[0] = "hello"
a[1] = "world"
fmt.Println(a, a[0], a[1]) //输出 [hello world ] hello world
/*
一个 slice 会指向一个序列的值,并且包含了长度信息。
[]T 是一个元素类型为 T 的 slice。
*/
array := []int{1, 3, 5, 7, 9, 11}
fmt.Println("array=", array) //输出 array= [1 3 5 7 9 11]
for i := 0; i < len(array); i++ {
fmt.Print(i, array[i], "\n")
}
/*
slice 可以重新切片,创建一个新的 slice 值指向相同的数组。
表达式
s[lo:hi]
表示从 lo 到 hi-1 的 slice 元素,含两端。因此
s[lo:lo]
是空的,而
s[lo:lo+1]
有一个元素。
*/
fmt.Println("array[1:4] ==", array[1:4])
// 省略下标代表从 0 开始
fmt.Println("array[:3] ==", array[:3])
// 省略上标代表到 len(s) 结束
fmt.Println("array[4:] ==", array[4:])
/*
slice 由函数 make 创建。这会分配一个零长度的数组并且返回一个 slice 指向这个数组:
a := make([]int, 5) // len(a)=5
为了指定容量,可传递第三个参数到 `make`:
b := make([]int, 0, 5) // len(b)=0, cap(b)=5
b = b[:cap(b)] // len(b)=5, cap(b)=5
b = b[1:] // len(b)=4, cap(b)=4
*/
a1 := make([]int, 5)
printSlice("a1", a1)
b1 := make([]int, 0, 5)
printSlice("b1", b1)
c1 := b1[:2]
printSlice("c1", c1)
d1 := c1[2:5]
printSlice("d1", d1)
}
func printSlice(s string, x []int) {
fmt.Printf("%s len=%d cap=%d %v\n",
s, len(x), cap(x), x)
}
运行结果如下
C:/Go/bin/go.exe build -i [C:/Go/src/test002]
成功: 进程退出代码 0.
C:/Go/src/test002/test002.exe [C:/Go/src/test002]
2 4
0xc0820062d8 2
0xc0820062d8 5
0xc082006300 2
{1 2}
5
{5 6} 5
{1 2} {1 0} {0 2} {0 0} &{1 2}
[hello world ] hello world
array= [1 3 5 7 9 11]
0 1
1 3
2 5
3 7
4 9
5 11
array[1:4] == [3 5 7]
array[:3] == [1 3 5]
array[4:] == [9 11]
a1 len=5 cap=5 [0 0 0 0 0]
b1 len=0 cap=5 []
c1 len=2 cap=5 [0 0]
d1 len=3 cap=3 [0 0 0]
成功: 进程退出代码 0.