• 够粉丝读书笔记


    1:定义string字符串,返回的是指针

    例子:

    s := "hello"
    if s[1] != 'e' { os.Exit(1) }
    s = "good bye"
    var p *string = &s
    *p = "ciao"
    下面的语句就是非法的.
    s[0] = 'x'
    (*p)[1] = 'y'
    注意:
        1:string返回的是指针,但是这个值不能被修改。就像const char*
     

    2:string和slice

    package main
    
    import (
             "fmt"
             "reflect"
    )
    
    
    func test(srcData []byte){
            fmt.Println(len(srcData))
            for i:=0;i<len(srcData);i++{
                    srcData[i] = srcData[i] + 1;
            }
    }
    
    
    func main(){
            a := [10]byte{0x30,0x31,0x32}
            fmt.Println(a)
            test(a[0:]) // ok,数组转换成切片,传递的是引用
             //test(&a) // error,数组到底是啥类型
             var b interface{}
            b = a
            dd := reflect.ValueOf(b)
            fmt.Println(dd.Kind()) //结果是:array 。表明是一个数组
             b = &a
            gg := reflect.ValueOf(b)
            fmt.Println(gg.Kind())//结果是:ptr 。表明是一个指针。但是注意,是指向[10]byte的指针。不是我们理解的[]byte
            fmt.Println(a)
            
            var e1 […]int{1,1,2,3} //这个是一个数组,编译器会自动计算长度
            var e2 [10]int{1,2,2,3} //这个是数组 
            var e3 []int{1,2,3,4} //这个是一个切片
            var e4 [10]int{1,2,3,4}[0:]
    }
    注意:1:数组传参数给函数,一般使用切片。
          2:标准定义切片方法。s := make([]int, 3, 10);     //一个slice,有三个参数 类型、slice长度、slice底层的array长度,即slice的最大容量。
     3:数组一般用于切片里面真正存储数据的容器。传递一个数组的参数,是指传递。数组的尺寸是数组类型的一部分。[10]int [20]int 他们的类型完全不一样
     4:切片传递是引用类型。所以在go里面,尽量传递切片。

    3:定义变量

    import "fmt"
    
    type student struct {
            a int
            b int
    }
    
    
    func sum(a *student){
            fmt.Println(a.a + a.b)
    }
    
    func main(){
    
    
            //定义一个变量
            var a student
            a.a = 123
            a.b = 333
            sum(&a)
    
            //定义一个变量,并且初始化
            d := student{a:123,b:3333}
            sum(&d)
    
    
            //new一个变量,返回的是指针
            b := new(student)
            b.a = 1
            b.b = 2
            sum(b)
    }

    4:常用风格以及易混淆点

    a:golang里面不需要分号。只有在for和两行语句写在一行。但是地道的程序分号只会在for里面出现

    b:golang里面if,for不需要()。但是需要{}。可以将多行语句写在if后,用分号分开.

    c:不要把{},左{单独写成一行

    d:go里面循环语句只有for。但是for有不同的表现形式。

                        1)for init; condition; post { } //类似 C 的 for

                        2)for condition { } //类似 C 的 while

                        3)for { }   // 类似 C 的 for(;;)

    5:.(type) 操作,通过一定的机制,可以知道这个变量的类型是多少。只能在switch里面使用。

    package main
    import "fmt"
    
    func main(){
            var a int = 1000
    
            //switch b:a.(type){  //错误
            var d interface{} = a
            switch b:=d.(type){
                    case int:
                            fmt.Println("type is int %T",b)
                    case *int:
                            fmt.Println("type is *int,%T",b)
                    default :
                            fmt.Println("type is unkown,%T",b)
            }
    }

    http://www.jmcneil.net/  这里有说明

    更多通过变量得到这个数据类型,看reflect包.

     

     
     
     
     
     
     
  • 相关阅读:
    渲染管线中的顶点变换
    导入图片时设置默认格式
    查找丢失组件的预制体
    移动到目标点的方法
    关于material和sharedMaterial的问题
    代码创建动画状态机
    设计模式学习笔记--访问者模式
    .net core 基于Dapper 的分库分表开源框架(core-data)
    .Net 微服务架构技术栈的那些事
    Asp.Net Core 中IdentityServer4 实战之角色授权详解
  • 原文地址:https://www.cnblogs.com/xloogson/p/3270535.html
Copyright © 2020-2023  润新知