以下是记录我学习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}
*/