Go--基础知识学习三

// 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.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值