数组
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 /* 设置元素为 i + 100 */ } /* 输出每个数组元素的值 */ for j = 0; j < 10; j++ { fmt.Printf("Element[%d] = %d ", j, n[j] ) } }
使用数组打印杨辉三角
package main import "fmt" func GetYangHuiTriangleNextLine(inArr []int) []int { var out []int //不写数组长度,Go 语言会根据元素的个数来设置数组的大小 var i int arrLen := len(inArr) out = append(out, 1) if 0 == arrLen { return out } for i = 0; i < arrLen-1; i++ { out = append(out, inArr[i]+inArr[i+1]) } out = append(out, 1) return out } func main() { nums := []int{} var i int for i = 0; i < 10; i++ { nums = GetYangHuiTriangleNextLine(nums) fmt.Println(nums) } }
数组作为参数,传递给函数
package main import "fmt" func main() { /* 数组长度为 5 */ var balance = []int {1000, 2, 3, 17, 50} var avg float32 /* 数组作为参数传递给函数 */ avg = getAverage( balance, 5 ) ; /* 输出返回的平均值 */ fmt.Printf( "平均值为: %f ", avg ); } 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; }
二维数组
package main import "fmt" func main() { /* 数组 - 5 行 2 列*/ 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 ", i,j, a[i][j] ) } } }
指针
package main import "fmt" func main() { var a int= 20 /* 声明实际变量 */ var ip *int /* 声明指针变量 */ ip = &a /* 指针变量的存储地址 */ fmt.Printf("a 变量的地址是: %x ", &a ) /* 指针变量的存储地址 */ fmt.Printf("ip 变量储存的指针地址: %x ", ip ) /* 使用指针访问值 */ fmt.Printf("*ip 变量的值: %d ", *ip ) }
指向指针的指针
package main import "fmt" func main() { var a int var ptr *int var pptr **int a = 3000 /* 指针 ptr 地址 */ ptr = &a /* 指向指针 ptr 地址 */ pptr = &ptr /* 获取 pptr 的值 */ fmt.Printf("变量 a = %d ", a ) fmt.Printf("指针变量 *ptr = %d ", *ptr ) fmt.Printf("指向指针的指针变量 **pptr = %d ", **pptr) }
向函数中传递指针
package main import "fmt" func main() { /* 定义局部变量 */ var a int = 100 var b int= 200 swap(&a, &b); fmt.Printf("交换后 a 的值 : %d ", a ) fmt.Printf("交换后 b 的值 : %d ", b ) } /* 交换函数这样写更加简洁,也是 go 语言的特性,可以用下,c++ 和 c# 是不能这么干的 */ func swap(x *int, y *int){ *x, *y = *y, *x }
结构体(Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型)
结构体作为函数参数
package main import "fmt" type Books struct { title string author string subject string book_id int } func main() { var Book1 Books /* 声明 Book1 为 Books 类型 */ var Book2 Books /* 声明 Book2 为 Books 类型 */ /* book 1 描述 */ Book1.title = "Go 语言" Book1.author = "www.runoob.com" Book1.subject = "Go 语言教程" Book1.book_id = 6495407 /* book 2 描述 */ Book2.title = "Python 教程" Book2.author = "www.runoob.com" Book2.subject = "Python 语言教程" Book2.book_id = 6495700 /* 打印 Book1 信息 */ printBook(Book1) /* 打印 Book2 信息 */ printBook(Book2) } func printBook( book Books ) { fmt.Printf( "Book title : %s ", book.title); fmt.Printf( "Book author : %s ", book.author); fmt.Printf( "Book subject : %s ", book.subject); fmt.Printf( "Book book_id : %d ", book.book_id); }
结构体指针
package main import "fmt" type Books struct { //定义结构体 title string author string subject string book_id int } func main() { var Book1 Books /* Declare Book1 of type Book,声明Book变量 */ /* book 1 描述 */ Book1.title = "Go 语言" Book1.author = "www.runoob.com" Book1.subject = "Go 语言教程" Book1.book_id = 6495407 //或者直接这样写 var Book2=Books{title: "Go 语言", author: "www.runoob.com", subject: "linux语言教程", book_id: 6495407} printBook(&Book1) //这里给printBook函数传递的参数是结构体对象Book1的地址,函数接收的参数应该是个指针 printBook(&Book2) } func printBook( book *Books ) { //这里*Books规定这里的参数类型是指针 fmt.Printf( "Book title : %s ", book.title); //使用结构体指针访问结构体成员,使用 "." 操作符,即和结构体变量访问结构体成员方法一致 fmt.Printf( "Book author : %s ", book.author); fmt.Printf( "Book subject : %s ", book.subject); fmt.Printf( "Book book_id : %d ", book.book_id); }
切片
切片 slice 定义切片 var identifier []type 声明一个未指定大小的数组来定义切片 var slice1 []type = make([]type, len) 使用make()函数来创建切片: slice1 := make([]type, len) make([]T, length, capacity) 可以指定容量,其中capacity为可选参数 切片初始化 s :=[] int {1,2,3 } 直接初始化切片,[]表示是切片类型,{1,2,3}初始化值依次是1,2,3.其cap=len=3 s := arr[:] 初始化切片s,是数组arr的引用 s := arr[startIndex:endIndex] 将arr中从下标startIndex到endIndex-1 下的元素创建为一个新的切片,这里和Python列表的索引一样,顾头不顾尾 s := arr[startIndex:] 缺省endIndex时将表示一直到arr的最后一个元素 s := arr[:endIndex] 缺省startIndex时将表示从arr的第一个元素开始 s1 := s[startIndex:endIndex] 通过切片s初始化切片s1 s :=make([]int,len,cap) 通过内置函数make()初始化切片s,[]int 标识为其元素类型为int的切片 append() 和 copy() 函数 如果想增加切片的容量,我们必须创建一个新的更大的切片并把原分片的内容都拷贝过来 var numbers []int numbers = append(numbers, 1) 向切片添加一个元素 numbers = append(numbers, 2,3,4) 同时添加多个元素 numbers1 := make([]int, len(numbers), (cap(numbers))*2) 创建切片 numbers1 是之前切片的两倍容量 copy(numbers1,numbers) 拷贝 numbers 的内容到 numbers1
package main import "fmt" func main() { sliceTest() twoDimensionArray() } //切片,实际的是获取数组的某一部分,len切片<=cap切片<=len数组,切片由三部分组成:指向底层数组的指针、len、cap func sliceTest() { arr := []int{1, 2, 3, 4, 5} s := arr[:] for e := range s { fmt.Println(s[e]) //1 2 3 4 5 } s1 := make([]int, 3) for e := range s1 { fmt.Println(s1[e]) //0 0 0 } } func twoDimensionArray() { var a = [][]int{{0, 0}, {1, 2}, {2,}, {3, 6}, {4, 8}} var i, j int for i = 0; i < len(a); i++ { for j = 0; j < len(a[i]); j++ { fmt.Printf("a[%d][%d]=%d ", i, j, a[i][j]) } } s1 := a[:3] fmt.Println(s1) //[[0 0] [1 2] [2]] s2 := a[:3][:2] fmt.Println(s2) //[[0 0] [1 2]] 这是在[:3]切片的基础上再进行切片 var new_s = [][]int{} for _, arry := range s1 { //go语言中定义或者接受的变量必须使用,否则会报错,我们使用下划线_接收不想使用的变量,这样就可以不使用这个变量了 fmt.Println(arry[:1]) // [0] [1] [2] new_s = append(new_s, arry[:1]) } fmt.Println(new_s) //[[0] [1] [2]] 得到新的二维数组 }