• 数组,结构体


    数组

    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]] 得到新的二维数组
    
    }
    

      

  • 相关阅读:
    unity 判断是安卓还是IOS平台
    C# set get 函数 属性访问器
    C# 字典 Dictionary
    掌握下面常用函数,学PHP不再难!
    阿里云云虚拟主机上个人网站的Https访问配置
    PHP中$_SERVER 参数详解,PHP判断当前访问的http还是https
    个人网站如何选择支付接口(API回调)
    备战NOIP——模板复习8
    备战NOIP——模板复习7
    备战NOIP——模板复习7
  • 原文地址:https://www.cnblogs.com/perfey/p/9885550.html
Copyright © 2020-2023  润新知