• 1.golang数据类型,转换,变量类型检查,生命周期、闭包,打印方法,指针简介


    golang是强类型,静态语言

    1.golang 数据类型

    布尔类型 true/false var b bool ,在golang底层bool不是1/0表示的

    数值类型 :var i int =3 / var i:=3

    数字在计算机内部是以二进制的方式存储的,二进制位就是一系列布尔值,取值要么为1,要么为0.

    1位表示1或0,对于4位整数可以表示16个不同的数字0~15.

    带符号整数和无符号整数: 带符号整数,就是负数,需要一位来表示符号,这通常是符号-。

    所以4位带符号整数的取值范围为 :-8~7 ;

    浮点数: 浮点数是带小数点的数字,如11.2,0.11,32.21.: var a float64 = 0.111

    字符串: var s string ="foo" ,必须用双引号 , s + = "foo",字符串的拼接

    数组: 声明数组时,必须指定其长度和类型 var arrOne [4]string , arrTwo [10]int

    赋值: arrOne[0] = "John" ,(通常数组的键用数字 )

    2.检查变量类型用: 标准库中的reflect包

    var s [2]string

    fmt.Println(reflect.TypeOf(s))

    3.类型转换: strconv包提供一整套类型装换方法,

    var s string = "true"

    b.err:=strconv.ParseBool(s ) 字符串转换布尔

    s:=strconv.FormatBool(true) 布尔值转换成字符串

    4.多变量赋值

    var s,t string = "foo","bar"

    var(

    s string = "foo"

    i int =4

    )

    默认值:整数0,浮点型0,布尔值false, 字符串就是“” 空字符串,打印:

    var (
      i int
      f float32
      b bool
      s string
    )
    fmt.Printf("%v %v %v %q ",i,f,b,s) //0 0 false ""
    package main

    import (
    "fmt"
    "time"
    )

    const DefaultClientTimeout = 30 * time.Second

    type Client struct{
    cache map[string]interface{}
    Host string
    Timeout time.Duration
    }

    func NewClient(host string) *Client{ //指向client结构体的一个指针,指针返回的是变量的地址,取出地址的值就用**Client
    return &Client{
    cache: map[string]interface{}{"name":"liufeng","age":21},
    Host:host,
    Timeout:DefaultClientTimeout,
    }
    }

    func main(){
    tt :=NewClient("www.baidu.com")
    fmt.Println(&tt.Host)
    fmt.Println(&tt)
    fmt.Println(tt.Host)
    fmt.Println(tt.cache["name"])
    fmt.Println(tt.cache["age"])
    }

    fmt.Printf("%f",1.23) %p 输出浮点数

    fmt.Printf("%d",123) %p 输出整数

    fmt.Printf("%+v",b) %+v 值输出, fmt.Printf("%p",&b) %p 输出指针地址 &b

    fmt.Printf() 配合占位符,打印数据。

    fmt.Println(打印字字符串内容)

    9.打印变量的方法:

     

    它不关心这些捕获了的变量和常量是否已经超出了作用域,所以只有闭包还在使用它,这些变量就还会存在。

    因为匿名函数(闭包),有一个很重要的特点:

    由于在定义Test( )函数时指定了返回的类型是一个匿名函数,并且该匿名函数返回的类型是整型。所以在Test( )函数中定义了一个匿名函数,并且将整个匿名函数返回,匿名函数返回的是整型。在main( )函数中定义了一个变量f,该变量的类型是匿名函数,f( )表示调用执行匿名函数。最终执行完成后发现,实现了数字的累加。虽然Test()已经返回了,但是返回的值:func()还在全局变量中使用,三次调用 f(),因此返回值会保存在堆上,即使栈释放了内存资源,但func()保存在堆中,数据不会释放。

    }

    fmt.Println(f())

    fmt.Println(f())

    f:=Test() fmt.Println(f())

    func main(){

    }

    }

    return x

    x++

    return func()int{

    var x int

    func Test() func() int{ //func() 这个就是匿名函数,作为类型返回值int

    利用匿名函数,实现每次调用变量累加值

    • 堆(heap):堆是用于存放进程执行中被动态分配的内存段。它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时。新分配的内存就被动态加入到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)

    • 栈(stack):栈又称堆栈, 是用户存放程序暂时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包含static声明的变量。static意味着在数据段中存放变量)。

    8.匿名函数类型,常用在闭包中,讲到闭包就要理解变量声明周期。

     

    2.在函数 返回值中 用指针,在最后函数返回值的时候 返回值的地址。接受函数返回值的变量也可以直接打印出来值,应该是印值复制的。

    总结: 1.在函数 形参中用 指针*int , 在调用函数 传入变量的地址 &var

     

    7.指针的灵活使用:

     

    6.常量声明: const

    (在golang中只有三种引用类型它们分别是切片slice、字典map、管道channel。其它的全部是值类型,引用类型可以简单的理解为指针类型,它们都是通过make完成初始化)

    打印变量内存地址: fmt.Println(&s) ,内存地址是十六进制表示

    var s string = "hello,world"

    要获取变量在内存中的地址,可在变量名前加上&字符。

    golang在声明变量时,在内存中分配了一个位置,以便能够存储,修改和获取变量的值。

    5.使用指针, 指针是golang的一种类型,指向变量所在的内存单元,声明在变量名前加上* 星号字符。

     

    变量作用域:指变量在什么地方可以使用,而不是变量在什么地方声明。

    简短变量声明: s : = "hello,world" ; 注意 golang规定不能再函数外面使用 简短变量声明

  • 相关阅读:
    stack2
    xctf 实时数据监测
    note-service2
    stack pivot学习
    sctf_2019_easy_heap 利用off-by-null构造出double free来向任一地址写入(经典)
    ciscn_2019_s_1 unlink或者of-by-null
    starctf_2019_babyshell 绕过循环检测注入shellcode
    sublime 安装package control
    windows上安装nodejs,升级npm,安装webpack指南
    mysql 常见语句
  • 原文地址:https://www.cnblogs.com/iifeng/p/11542382.html
Copyright © 2020-2023  润新知