Go -- 基本程序结构

栏目: Go · 发布时间: 5年前

内容简介:GO语言A=10,B=20,Go语言没有前置的++,--A=10,B=20
  1. 源代码以_test结尾:xxx_test.go
  2. 测试方法名以Test开头: func TestXxx(t *testing.T) {} ,大写的方法表示 包外 可以访问
// first_test.go
package try_test

import "testing"

func TestFirstTry(t *testing.T) {
    t.Log("My First try!")
}

变量 + 常量

变量

// fib_test.go
package fib

import (
    "fmt"
    "testing"
)

// var一般用于全局变量或者外部变量
var g = 1

func TestFibList(t *testing.T) {
    g = 2

    // 第1种方式
    //var a int = 1
    //var b int = 1

    // 第2种方式,具有一定的类型推断能力
    //var a = 1
    //var b = 2

    // 第3种方式
    //var (
    //	a = 1
    //	b = 2
    //)

    // 第4种方式
    a := 1
    b := 2

    t.Log(a)
    for i := 0; i < 5; i++ {
    	t.Log(b)
    	tmp := a
    	a = b
    	b = tmp + a
    }
    fmt.Println()
}

func TestExchange(t *testing.T) {
    a := 1
    b := 2
    // 同时赋值
    a, b = b, a
    t.Log(a, b)
}
  1. 赋值可以进行 自动类型推断
  2. 在一个赋值语句中可以对多个变量进行 同时赋值

常量

// constant_test.go
package constant

import "testing"

// 快速设置连续值
const (
    // const iota int = 0
    Monday = iota + 1
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
    Sunday
)

const (
    Readable   = 1 << iota // 0001
    Writable               // 0010
    Executable             // 0100
)

func TestConstant1(t *testing.T) {
    t.Log(Monday, Tuesday) // 1,2
}

func TestConstant2(t *testing.T) {
    a := 1 // 0001
    // & 按位与
    t.Log(a&Readable == Readable, a&Writable == Writable, a&Executable == Executable) // true,false,false
}

数据类型

基本数据类型

  1. bool
  2. string
  3. int int8 int16 int32 int64
  4. uint uint8 uint16 uint32 uint64 uintptr
  5. byte // alias for uint8
  6. rune // alias for uint32, represents a Unicode code point
  7. float32 float64
  8. complex64 complex128

类型转换

  1. Go语言 不允许隐式类型转换
  2. 别名和原有类型也不能进行隐式类型转换
// 别名
type MyInt int64

func TestImplicit1(t *testing.T) {
    var a1 int = 1 // 64位机器,int占用64位
    var a2 int32 = 1
    var b int64
    b = a1 // cannot use a1 (type int) as type int64 in assignment
    b = a2 // cannot use a2 (type int32) as type int64 in assignment
}

func TestImplicit2(t *testing.T) {
    var a int32 = 1
    var b int64
    b = int64(a) // 显式类型转换
    var c MyInt
    c = b        // cannot use b (type int64) as type MyInt in assignment
    c = MyInt(b) // 显式类型转换
    t.Log(a, b, c)
}

类型的预定义值

  1. math.MaxInt64
  2. math.MaxFloat64
  3. math.MaxUint32

指针类型

GO语言 不支持指针运算

func TestPoint(t *testing.T) {
    a := 1
    aPtr := &a
    t.Log(a, aPtr)           // 1 0xc00001a210
    t.Logf("%T %T", a, aPtr) // int *int
    aPtr = aPtr + 1          // invalid operation: aPtr + 1 (mismatched types *int and int)
}

字符串

  1. 在大多数编程语言中(例如Java),字符串是 引用类型指针类型
  2. 而在 Go 语言中,string是 值类型 ,默认的初始化值为 空字符串 ,而不是nil
func TestString(t *testing.T) {
    var s string
    t.Log("*" + s + "*") // **
    t.Log(len(s))        // 0
    t.Log(s == "")       // true
}

运算符

算术运算符

A=10,B=20,Go语言没有前置的++,--

运算符 描述 实例
+ 相加 A+B => 30
- 相减 A-B => -20
* 相乘 A*B => 200
/ 相除 A/B => 2
% 求余 A%B => 0
++ 自增 A++ => 11
-- 自减 A-- => 9

比较运算符

A=10,B=20

运算符 描述 实例
== 检查左边值是否 等于 右边值,若是返回True,否则返回False (A == B) => False
!= 检查左边值是否 不等于 右边值,若是返回True,否则返回False (A != B) => True
> 检查左边值是否 大于 右边值,若是返回True,否则返回False (A > B) => False
< 检查左边值是否 小于 右边值,若是返回True,否则返回False (A < B) => True
>= 检查左边值是否 大于等于 右边值,若是返回True,否则返回False (A >= B) => False
<= 检查左边值是否 小于等于 右边值,若是返回True,否则返回False (A <= B) => True

数组

  1. 相同维数且含有相同个数元素的数组才可以比较
  2. 每个元素都相同才相等
func TestCompareArray(t *testing.T) {
    a := [...]int{1, 2, 3, 4}
    b := [...]int{1, 4, 2, 3}
    c := [...]int{1, 2, 3, 4, 5}
    d := [...]int{1, 2, 3, 4}
    t.Log(a == b) // false
    t.Log(a == c) // invalid operation: a == c (mismatched types [4]int and [5]int)
    t.Log(a == d) // true
}

逻辑运算符

A=true,B=false

运算符 描述 实例
&& 逻辑AND运算符 (A && B) => False
|| 逻辑OR运算符 (A || B) => True
! 逻辑NOT运算符 !(A && B) => True

位运算符

运算符 描述
& 按位与运算符
| 按位或运算符
^ 按位异或运算符
<< 左移运算符
>> 右移运算符

按位置零&^

  1. &^:右边操作数的二进制为1的位会把左边操作数的对应的二进制位 重置为0
  2. 在其他编程语言中(如Java),需要组合多个位运算符才能完成
const (
    Readable   = 1 << iota // 0001
    Writable               // 0010
    Executable             // 0100
)

func TestBitClear(t *testing.T) {
    a := 7                                                                            // 0111 = Readable + Writable + Executable
    t.Log(a&Readable == Readable, a&Writable == Writable, a&Executable == Executable) // true true true
    a = a &^ Readable                                                                 // 清空Readable
    t.Log(a&Readable == Readable)                                                     // false
    a = a &^ Writable                                                                 // 清空Writable
    t.Log(a&Writable == Writable)                                                     // false
    a = a &^ Executable                                                               // 清空Executable
    t.Log(a&Executable == Executable)                                                 // false
}

循环 + 条件

循环

Go语言仅支持循环关键字for

func TestWhileLoop(t *testing.T) {
    n := 0
    // while(n<5)
    for n < 5 {
    	t.Log(n)
    	n++
    }

    // while(true)
    for {
    	t.Log(n)
    	n++
    }
}

条件

if

  1. condition表达式结果必须为布尔值
  2. 支持 变量赋值
func TestIfMultiSec(t *testing.T) {
    if a := 1 == 1; a {
    	t.Log("1==1")
    }
}

switch

  1. 条件表达式不限制为 常量 或者 整数
  2. 单个case中,可以出现 多个结果选项 ,使用逗号分隔
  3. C语言 等规则相反,Go语言不需要用 break 来明确退出一个case
  4. 可以不设定switch之后的条件表达式,此时整个switch结构与多个if/else的逻辑作用等同
func TestSwitchMultiCase(t *testing.T) {
    for i := 0; i < 5; i++ {
    	switch i {
    	case 0, 2: // 多个结果选项
            t.Log("Even")
    	case 1, 3:
            t.Log("Odd")
    	default:
            t.Log("Not 0~3")
    	}
    }
}

func TestSwitchCondition(t *testing.T) {
    for i := 0; i < 5; i++ {
    	switch {
    	case i%2 == 0:
            t.Log("Even")
    	case i%2 == 1:
            t.Log("Odd")
    	default:
            t.Log("Unknown")
    	}
    }
}

以上所述就是小编给大家介绍的《Go -- 基本程序结构》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

数据压缩导论

数据压缩导论

萨尤得 / 2009-2 / 99.00元

《数据压缩导论(英文版·第3版)》是数据压缩方面的经典著作,介绍了各种类型的压缩模式。书中首先介绍了基本压缩方法(包括无损压缩和有损压缩)中涉及的数学知识,为常见的压缩形式打牢了信息论基础,然后从无损压缩体制开始,依次讲述了霍夫曼编码、算术编码以及字典编码技术等,对于有损压缩,还讨论了使用量化的模式,描述了标量、矢量以及微分编码和分形压缩技术,最后重点介绍了视频加密。《数据压缩导论(英文版·第3版......一起来看看 《数据压缩导论》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具