Go练习(四)

以下是记录我学习Go时练习的小程序段,接上篇,已经过编译通过,在此记录,以供翻阅复习

//Go 语言提供了数组类型的数据结构。

/*
数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,
这种类型可以是任意的原始类型例如整形、字符串或者自定义类型。
*/
/*
var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
var data float32=balance[4]   取balance第10个元素的值
/*
初始化数组中 {} 中的元素个数不能大于 [] 中的数字。

如果忽略 [] 中的数字不设置数组大小,Go 语言会根据元素的个数来设置数组的大小
*/
package main
import "fmt"
func main(){
	var n [10]int    //n是一个长度为10的数组
	var i,j int

	//为数组n初始化元素
	for i= 0; i < 10; i++ {
		n[i]=i+100
	}
	for j=0; j < 10; j++ {
		fmt.Printf("Element[%d]=%d\n",j,n[j])
		//Printf才能识别 %d,Println不能识别 %d
	}
}
/*
初始化多维数组
var threedim [5][10][4]int
初始化二维数组
a=[3][4]int{
	{0,1,2,3},
	{4,5,6,7},
	{8,9,10,11},
}
或者
a=[3][4]int{
	{0,1,2,3},
	{4,5,6,7},
	{8,9,10,11}}
	注意:以上代码中倒数第二行的 } 必须要有逗号,因为最后一行的 } 不能单独一行。

二维数组通过指定坐标来访问。如数组中的行索引与列索引
val:=a[2][3]
或者
var value int =a[2][3]
以上实例访问了二维数组 val 第三行的第四个元素。

*/
package main 
import "fmt"
func main(){
	var a=[5][2]int{{0,0},{1,2},{2,4},{3,6},{4,8}}
	var i,j int
	for i = 0; i < 5; i++ {
		for j = 0; j < 2; j++ {
			fmt.Printf("a[%d][%d]=%d\n",i,j,a[i][j])
		}
	}
}
package main
import "fmt"
//实例中函数名接收整型数组参数,另一个参数制定了数组元素的个数,并返回平均值
func getAverage(arr []int,size int) float32{
	var i,sum int 
	var avg float32
	for i = 0; i < size; i++ {
		sum += arr[i]
	}
	avg=float32(sum)/float32(size)
	return avg;
}
func main(){
	var balance=[]int{1000,2,3,17,50}
	var avg float32
	avg=getAverage(balance,5)
	fmt.Printf("平均值为:%f\n",avg)
/*
以上实例执行输出结果为:

平均值为: 214.399994

以上实例中我们使用的形参并为设定数组大小。

浮点数计算输出有一定的偏差,你也可以转整型来设置精度。
*/
a:=1690
b:=1700
c:=a*b
fmt.Println(c)
fmt.Println(float64(c)/1000000)
}

//Go语言指针
/*Go语言中可以使用指针更简单的执行一些任务
变量是一种使用方便的占位符,可以引用计算机内存的地址
取地址符号是 &,可以放到一个变量前使用就会返回相应变量的内存地址

*/
package main
import "fmt"
func main(){
	var a int=10
	fmt.Printf("a变量的地址:%x\n",&a);          //变量的地址: 20818a220

/*
一个指针变量指向了一个值的内存地址
类似于常量和变量,在使用指针前你需要声明指针。
像
var  ip *int      //指向整型
var fp *float32   //指向浮点型 

指针使用的流程:
1定义指针变量
2为指针变量赋值
3访问指针变量中指向地址的值

在指针类型前面加上*号(前缀)来获取指针所指向的内容

*/


	var ip *int
	ip = &a
	fmt.Printf("a 变量的地址是:%x\n",&a)

	//指针变量的存储地址
	fmt.Printf("ip变量存储的指针地址:%x\n",ip)

	//使用指针访问值
	fmt.Printf("*ip变量的值:%d\n",*ip)

	/*
		a 变量的地址是: 20818a220
		ip 变量储存的指针地址: 20818a220
		*ip 变量的值: 20
	*/

	//Go空指针
	/*
	当一个指针被定义后没有分配到任何变量时,它的值为nil
	nil指针也被称为空指针
	nil在概念上与其他语言的NULL,NONE,nil,null一样,都能指代零值或空值。
	一个指针变量通常缩写为ptr
	*/
	var ptr *int
	fmt.Printf("ptr 的值为:%x\n",ptr)    //ptr 的值为 : 0

		/*
		空指针判断:

		if(ptr != nil)     ptr 不是空指针
		if(ptr == nil)     ptr 是空指针 

		*/
}
//Go指针数组
package main
import "fmt"
const MAX int=3

func main(){
	a:=[]int{10,100,1000}
	var i int
	for i = 0; i < MAX; i++ {
		fmt.Printf("a[%d]=%d\n",i,a[i])
	}
	/*
		以上代码执行输出结果为:
		a[0] = 10
		a[1] = 100
		a[2] = 1000
	*/

	//可能需要保存数组,这样就需要用到指针
	var ptr [MAX]*int
	//ptr是指针型数组。因此每个元素都指向了一个值。
	for i = 0; i < MAX; i++ {
		ptr[i] = &a[i]    //整数地址赋值给指针数组
	}

	for i = 0; i < MAX; i++ {
		fmt.Printf("a[%d]=%d\n",i,*ptr[i])
	}
	/*
	以上代码执行输出结果为:
		a[0] = 10
		a[1] = 100
		a[2] = 1000
	*/
}
//Go指向指针的指针
/*
如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量
当定义一个指向指针的指针变量时,第一个指针存放第二个指针的地址,第二个指针存放变量的地址

var ptr **int

*/
package main
import "fmt"
func main(){
	var a int 
	var ptr *int
	var pptr **int
	a=300
	//指针ptr地址
	ptr = &a
	//指向指针ptr地址
	pptr=&ptr
	//获取pptr的值
	fmt.Printf("变量a=%d\n",a)
	fmt.Printf("指针变量 *ptr=%d\n",*ptr)
	fmt.Printf("指向指针的指针变量 **pptr=%d\n",**pptr)
}
/*
变量a=300
指针变量 *ptr=300
指向指针的指针变量 **pptr=300
*/
//Go指针作为函数参数
/*
允许向函数传递指针,只需要在函数定义的参数上设置指针类型即可

如何向函数传递指针,并且函数调用后修改函数内的值

*/

package main
import "fmt"
func swap(x *int,y *int){
	var temp int
	temp=*x
	*x=*y
	*y=temp
}
func main(){
	var a int =100
	var b int =200
	fmt.Printf("交换前a的值:%d\n",a)
	fmt.Printf("交换前b的值:%d\n",b)

	/* 调用函数用于交换值
	 * &a 指向 a 变量的地址
	 * &b 指向 b 变量的地址
	 */
	 swap(&a,&b)
	 fmt.Printf("交换后a的值:%d\n",a)
	 fmt.Printf("交换后b的值:%d\n",b)
}

/*

以上实例允许输出结果为:

交换前 a 的值 : 100
交换前 b 的值 : 200
交换后 a 的值 : 200
交换后 b 的值 : 100

*/
//Go  结构体
/*
在数组中可以存储同一类型的数据,

在结构体中可以为不同项定义不同的数据类型

结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。

结构体定义需要Type和struct语句
*/

package main
import "fmt"
type Books struct{
	title string
	author string
	subject string
	book_id int
}
func main(){
	// 创建一个新的结构体
	fmt.Println(Books{"Go语言","www.aaa.com","GO语言",6495407})
	// 可以使用 key => value 格式
	fmt.Println(Books{title:"Go语言",author:"www.aaa.com",subject:"GO语言",book_id:6495407})
	//使用key=>value格式可以部分赋值,忽略的字段为0或空
	fmt.Println(Books{title:"Go语言",author:"www.aaa.com"})
}

/*
打印结果:
{Go语言 www.aaa.com GO语言 6495407}
{Go语言 www.aaa.com GO语言 6495407}
{Go语言 www.aaa.com  0}
*/

猜你喜欢

转载自blog.csdn.net/qq_37887131/article/details/89041945