Go基本数据类型

第一部分:基本数据类型和操作符

1. 文件名&关键字&标识符

1. 所有go源码以.go结尾

2. 标识符以字母或下划线开头,大小写敏感,比如:

a. boy   b. Boy   c. a+b      d.  0boy    e. _boy  f. =_boy  g.  _

3. _是特殊标识符,用来忽略结果

4. 保留关键字

break    default   func  interface  select

case    defer     go     map      struct

chan    else    goto   package    switch

const    fallthough    if       range     type

continue     for       import   return    var

3. 常量和变量

4. 数据类型和操作符

5. 字符串类型

go程序的基本结构

package main

import “fmt”

func main() {
fmt.Println(“hello, world”)
}

运行:

  go run hello.go

1. 任何一个代码文件隶属于一个包

2. import 关键字,引用其他包:

import(“fmt”)
import(“os”)
通常习惯写成:
import (
“fmt”
“os”
 )

3. golang可执行程序,package main,并且有且只有一个main入口函数

4. 包中函数调用:

a. 同一个包中函数,直接调用

b. 不同包中函数,通过包名+点+函数名进行调用

5. 包访问控制规则:

a. 大写意味着这个函数/变量是可导出的

b. 小写意味着这个函数/变量是私有的,包外部不能访问

包的概念

练习

方式一:

main.go

package main

import (
"fmt"
"go_dev/day2/example1/add"
) func main() {
fmt.Println("Name:", add.Name)
fmt.Println("Age:", add.Age)
}

add.go

package add

// 可以这么声明赋值,在编译前就确定值了
var Name string = "hbw"
var Age int = 18

方式二:

main.go

package main

import (
"fmt"
"go_dev/day2/example1/add"
) func main() {
add.Test()
fmt.Println("Name:", add.Name)
fmt.Println("Age:", add.Age)
}

add.go

package add

var Name string  // 默认 ""
var Age int // 默认 1 // 不能这么赋值,编译会出错
// Name = "hbw"
// Age = 18 // 要有入口函数,才能初始化值
// 执行语句不能独立与函数之外
func Test() {
Name = "hbw"
Age = 18
}

包取别名

4. 每个源文件都可以包含一个init函数,这个init函数在main函数执行前自动被go运行框架调用。开发一个程序演示这个功能?

执行顺序:先全局变量  --> init -->  main

main.go

package main

import (
"fmt"
"go_dev/day2/example1/add"
) // add的init函数在main执行前执行,就获得了add.Name,add.Age的值
func main() {
fmt.Println("Name:", add.Name)
fmt.Println("Age:", add.Age)
}

add.go

package add

var Name string  // 默认 ""
var Age int // 默认 1 func init() {
Name = "hbw"
Age = 18
}

5. 包的只初始化,不引用。请开发一个程序,演示这个做法

package main

import(
_ “add”
) func main () { fmt.Println(“add not refer:”)
}

函数声明和注释

1. 函数声明: func   函数名字 (参数列表) (返回值列表){}

2. 注释,两种注释,单行注释: // 和多行注释  /* */

常量

1. 常量使用const 修饰,代表永远是只读的,不能修改。

2. const 只能修饰boolean,number(int相关类型、浮点类型、complex)和string。

3. 语法:const identifier [type] = value,其中type可以省略。

4. 比较优雅的写法:

const (

a = 0

b = 1

c = 2

)

5. 更加专业的写法:

iota讲解:

https://studygolang.com/articles/2192

// iota: a为0,下面的变量自增1

const (

a = iota

b    //

c    //

)

变量

1. 语法:var identifier type

package main
import (
“fmt”
“os”
) func main() {
var goos string = os.Getenv(“GOOS”)
fmt.Printf(“The operating system is: %s\n”, goos)
path := os.Getenv(“PATH”)
fmt.Printf(“Path is %s\n”, path)
}

值类型和引用类型

1. 值类型:变量直接存储值,内存通常在栈中分配。

2. 引用类型:变量存储的是一个地址,这个地址存储最终的值。内存通常在堆上分配。通过GC回收。

1. 值类型:基本数据类型int、float、bool、string以及数组和struct。

把值类型传入函数改变它的值,外面的值不会变

2. 引用类型:指针、slice、map、chan等都是引用类型。

把引用类型传入函数改变它的值,外面的值也会变

9. 写一个程序,交换两个整数的值。比如: a=3; b=4; 交换之后:a=4;b=3

package main

import (
"fmt"
) // *a = 100 是内存地址里的值
func swap(a *int,b *int) {
fmt.Println("a: ", a, *a,"b: ", b, *b)
tmp := *a
*a=*b
*b=tmp
} func main(){
first:=100
second:=200
swap(&first,&second) // &first 传的是内存地址0xc042068058
fmt.Print(first,second)
}

方式二:

package main

import (
"fmt"
) func main() {
a:=100
b:=200
a,b = b,a
fmt.Print(a,b)
}

变量的作用域

1. 在函数内部声明的变量叫做局部变量,生命周期仅限于函数内部。

2. 在函数外部声明的变量叫做全局变量,生命周期作用于整个包,如果是大写的,则作用于整个程序。

注意:

a := 100 // 不能在全局使用,编译会报错

// 因为它是两条语句,全局只能声明变量,不能执行代码
a := 100
等价
var a int
a = 100 // 是赋值语句,只能在函数里执行,全局它就会报错

数据类型和操作符

1. bool类型,只能存true和false

var a bool
var a bool = true
var a = true

2. 相关操作符, !、&&、||

var a bool = true
var b bool // 默认false 请问!a 、!b、a && b、a || b的值分别是多少?
a && b 与
短路特性
前面是false,它就不会求后面的表达式了
a || b 或
短路特性
前面是true,它就不会求后面的表达式了

3. 数字类型,主要有int、int8、int16、int32、int64、uint8、uint16、uint32、uint64、float32、float64

uint无符号类型 符号占一位

4. 类型转换,type(variable),比如:var a int=8;  var b int32=int32(a)

package main
func main() {
var a int
var b int32
a = 15
b = a + a // compiler error
b = b + 5 // ok: 5 is a constant
}

13. 请指出下面程序的输出是什么?

package main
import “fmt”
func main() {
var n int16 = 34
var m int32 m = n // 编译报错
m = int32(n)
// Printf 格式化输出
fmt.Printf(“32 bit int is: %d\n”, m)
fmt.Printf(“16 bit int is: %d\n”, n)
}

1. 逻辑操作符: == 、!=、<、<=、>和 >=

2. 数学操作符:+、-、*、/等等

package main
Import ”fmt”
func main() {
var a int = 10
var b = a + 10
}

5. 字符类型:var a byte

   var a byte = ‘c’

6. 字符串类型: var str string

package main
import “fmt”
func main() {
var str = “hello world”
fmt.Println(“str=“, str)
}

1. 字符串表示两种方式: 1)双引号    2)``   (反引号)

package main

import "fmt"

func main() {
var str = "hello world\n\n"
// 反引号原样输出
var str2 = `hello \n \n \n
this is a test string
This is a test string too·`
fmt.Println("str=", str)
fmt.Println("str2=", str2)
}

var b byte = 'c' 输出的是asscii表的数字和Java一样

服务器负载均衡

大型互联网公司负载均衡使用的是自己写的rpc库,实现负载均衡,健康检查

用rpc好处 rpc和web在一个进程里面rpc只是个库,这样我们就没有一个集中式的东西

LVS有个集中式的,流量都通过LVS去转发,但通过LVS转发可能有问题,LVS到了性能瓶颈,扛不住了,那所有通过LVS去转发的服务都会受影响

通过rpc去调,就不会通过集中式的中间节点,不会有断点的问题

有中间节点的话,中间节点(LVS)挂了,后面所有的等于就挂了

后面的服务器挂了一台,它会被rpc剔除,类似nginx upstream模块

Go基本数据类型的更多相关文章

  1. JavaScript 中的数据类型

    Javascript中的数据类型有以下几种情况: 基本类型:string,number,boolean 特殊类型:undefined,null 引用类型:Object,Function,Date,Ar ...

  2. JS 判断数据类型的三种方法

    说到数据类型,我们先理一下JavaScript中常见的几种数据类型: 基本类型:string,number,boolean 特殊类型:undefined,null 引用类型:Object,Functi ...

  3. Python高手之路【二】python基本数据类型

    一:数字 int int(整型): 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,即-2147483648-2147483647 在64位系统上,整数的位数为64位,取值 ...

  4. UniqueIdentifier 数据类型 和 GUID 生成函数

    UniqueIdentifier 数据类型用于存储GUID的值,占用16Byte. SQL Server将UniqueIdentifier存储为16字节的二进制数值,Binary(16),按照特定的格 ...

  5. SQL Server常见数据类型介绍

    数据表是由多个列组成,创建表时必须明确每个列的数据类型,以下列举SQL Server常见数据类型的使用规则,方便查阅. 1.整数类型 int 存储范围是-2,147,483,648到2,147,483 ...

  6. 由js apply与call方法想到的js数据类型(原始类型和引用类型)

    原文地址:由js apply与call方法想到的js数据类型(原始类型和引用类型) js的call方法与apply方法的区别在于第二个参数的不同,他们都有2个参数,第一个为对象(即需要用对象a继承b, ...

  7. python 数据类型 ----字典

    字典由一对key:value 组成的 python中常用且重量级的数据类型 1. key , keys, values 字典由一对key:value 组成的 python中常用且重量级的数据类型 1. ...

  8. SQL数据类型

    1.Character 字符串: 数据类型 描述 存储 char(n) 固定长度的字符串.最多8,000个字符. n varchar(n) 可变长度的字符串.最多8,000个字符.   varchar ...

  9. 跟着老男孩教育学Python开发【第二篇】:Python基本数据类型

    运算符 设定:a=10,b=20 . 算数运算 2.比较运算 3.赋值运算 4.逻辑运算 5.成员运算 基本数据类型 1.数字 int(整型) 在32位机器上,整数的位数为32位,取值范围为-2**3 ...

  10. 我的MYSQL学习心得(二) 数据类型宽度

    我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

随机推荐

  1. 各种Java加密算法

    如基本的单向加密算法: BASE64 严格地说,属于编码格式,而非加密算法 MD5(Message Digest algorithm 5,信息摘要算法) SHA(Secure Hash Algorit ...

  2. html页面中event的常见应用

    一:获取键盘上某个按键的unicode值 <html> <head> <script type="text/javascript"> funct ...

  3. IAR 9+ 编译 TI CC2541 出现 Segment ISTACK (size: 0xc0 align: 0) is too long for segment definition.

    IAR 9+ 编译 TI CC2541 出现 Segment ISTACK (size: 0xc0 align: 0) is too long for segment definition. Segm ...

  4. 黄聪:如何配置Emeditor实现代码智能识别自动完成功能

    设置方法如图所示: 效果如下图所示:

  5. Keil for ARM与C++

    1. 如果你的程序中使用了C++全局变量,那么*不要*使用MicroLIB,否则Keil会说某某Symbol找不到 2. 不使用MicroLIB带来的一个问题是KEIL会使用semihosting S ...

  6. javascript 判断空数组

    javascript里判断空数组不能用 []==[] 这样来判断,因为数组也是个对象,普通对象通过指针指向的内存中的地址来做比较 所以 []==[]结果为false,因此判断数组是否为空 用 [].l ...

  7. SPOJ Count on a tree(主席树+LCA)

    一.题目 COT - Count on a tree You are given a tree with N nodes. The tree nodes are numbered from 1 to  ...

  8. Keras 入门

    “sample”“batch”“epoch” Sample:样本,比如:一张图像是一个样本,一段音频也是一个样本. Batch:批,含有N个样本的集合.每一个batch的样本都是独立的并行处理.在训练 ...

  9. 在SUSE Linux Enterprise 11 SP1上用UDEV SCSI配置ASM

    1. 编辑/etc/scsi_id.config文件,如果该文件不存在,则创建该文件,添加如下行: options=–whitelisted –replace-whitespace 2. 获取需要绑定 ...

  10. Ansible 系列之 Inventory 资源清单介绍

    一.Inventory 库存清单文件 1.Inventory 作用 Ansible 可以在同一时间针对多个系统设施进行管理工作.它通过选择Ansible 资源清单文件中列出的系统,该清单文件默认是在/ ...