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规定不能再函数外面使用 简短变量声明

原文地址:https://www.cnblogs.com/iifeng/p/11542382.html