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