Go语言学习 _基础001

HelloWorld
package main // main 函数必须处于 main 包中 不管是在什么路径下 反正就是要有main包

import (  // 引入 包 对多个包的 引入可以这样简写
"fmt" // 对于单个包 : import "fmt" 即可
"os"
) func main() { fmt.Println("Hello World" )
fmt.Println(os.Args)
if len(os.Args) > 1 {
fmt.Println("Hello World" , os.Args[1]) // 输出 main函数参数 在 参数数组长度大于 1 时
}
//return 1 不能在 main() 里面直接返回参数 编译无法通过
os.Exit(-1) // 可以通过这样的 方式 带出 参数
}
测试相关

测试的程序 一定要写在 xxx_test 文件下 测试的 function 一定要是 TestXxxx 至于其他成分 之后在再进行解释,示例如下

package fib_test

import (
"fmt"
"testing"
) func TestFibList(t *testing.T) { // 实现一个 简单的 斐波那契数列输出
var a int = 1
var b int = 1
fmt.Print(a)
for i := 0; i < 5; i++ {
fmt.Print(" ", b)
tmp := a
a = b
b = tmp + a
}
fmt.Println()
} func TestExchange(t *testing.T) {
a := 1
b := 2
t.Log(a, b)
a, b = b, a // 像是 python go 也支持这样简写的 变量交换
t.Log(a, b)
}
常量相关:

iota只能被使用在const限定中,相当于一个常量的计数器 或者说是 迭代操作的关键字

iota相当于一个枚举值,默认从0开始,在一个const中,会进行+1,或者其他类型的操作

iota不会因为const中被赋值了固定值,就不再增加,const中每有一个常量就+1,如下一周七天的例子

每次进入一个新的const,iota都会重新开始计算

像下面的 可读、可写、可执行 这三个权限 常量的 都是 对 1 的 左移操作,常数每多定义一个 就会 带上上一个的值和操作 重新运算 得出新的 参数值。

package constant_test

import "testing"

const (
Monday = iota + 1 // 对于连续常量采用的 简洁写法
Tuseday
Wednesday
Thu
Fir
Sat
Sun
) const (
Readable = 1 << iota
Writeable
Executable
) func TestConstant(t *testing.T) {
t.Log(Monday, Tuseday)
} func TestXable(t *testing.T) {
//t.Log()
a := 7 // 0111
t.Log(a&Readable == Readable, a&Writeable == Writeable, a&Executable == Executable)
}
变量的定义:

go 中 有变量推断器 我们可以严格的按照类型声明变量(如果需要先声明在进行初始化),也可以直接采用简略的 方式 对变量进行声明和初始化

package type_test

import (
"fmt"
"testing"
) type MyInt int64 func TestImplicit(t *testing.T) { // go 不支持任何形式的 默认 的 类型转换 有需转换 必须声明
var a int32 = 1
var b int64 // Go语言中 有 int64 和 int32 两个 整形类别 , 是可以直接声明 int 的 但是 int 的 长度就 与 OS 字长 直接相关 为减少 不确定因素 建议 在定义变量时 做显式的 声明
b = int64(a)
var c MyInt
//c = b 严格的限制 让 哪怕是 同类型的 别名都不能 自动转换
c = MyInt(b)
t.Log(a, b, c)
} func TestPoint(t *testing.T) {
a := 1 // 采用简略的 方式 对变量进行声明和初始化
aPtr := &a // 获取指针
//aPtr = aPtr + 1 // invalid operation: aPtr + 1 (mismatched types *int and int) TODO 不支持指针运算,避免越界
t.Log(a, aPtr)
//t.Log("%T %T", a, aPtr) // Log call has possible formatting directive %T
fmt.Printf("%T %T", a, aPtr)
} func TestString(t *testing.T) {
var s string // 字符串 在 go 中 是一种 基本类型 // 其实质就和 类型的 名字一样 是一个个 字符串接起来的
// go 中 没有 专门的 char 类型 所有 字符 都是 通过 整形 来 存储的 不过 只是根据 需要 使用 长度 不同的 整形 byte、int32、int64、uint8、uint16、uint32、uint64 都是可以的
t.Log("*" + s + "*")
t.Log(len(s))
//if s == nil { TODO string 默认初始化为 "" 所以不需要这个对空值的判断
if s == "" { }
}
运算符:

没有前置 ++ 、-- 只支持后置,这也是go语言坚持的 只用一种方式 解决一类问题的理念。

‘==’ :可以使用 == 来比较数组

  • 相同维数且每个元素都一致的两个数组 可以判等
package opt_test

import "testing"

const (
Readable = 1 << iota // 0001
Writeable // 0010
Executable // 0100
) func TestCompareArray(t *testing.T) {
a := [...]int{1, 2, 3, 4}
b := [...]int{1, 3, 4, 5}
// c := [...]int{1, 2, 3, 4, 5}
d := [...]int{1, 2, 3, 4}
t.Log(a == b)
//t.Log(b == c) 维度不同 编译都无法通过
t.Log(d == a)
}
func TestBitClear(t *testing.T) {
//t.Log()
a := 7 // 0111
// &^ 按位清零
a = a &^ Readable
a = a &^ Executable
t.Log(a&Readable == Readable, a&Writeable == Writeable, a&Executable == Executable)
// === RUN TestBitClear
// opt_test.go:27: false true false
// --- PASS: TestBitClear (0.00s)
// PASS
}

Go语言学习 _基础001的更多相关文章

  1. Groovy语言学习--语法基础(5)

    至此groovy语言学习-语法基础就结束了,新的工作已经安排下来,要干活了. 对groovy了解到一定程度之后就可以在java项目中对其进行引入了.为此新建了一个微型的项目,个人觉得千言万语不如代码实 ...

  2. Groovy语言学习--语法基础(1)

    2018年11月末,从上家公司离职后进入现在的公司.进入项目以来,发现项目中有很多groovy脚本,以前没接触过groovy,抽时间系统地学一下,也方便后期项目的开发和维护. groovy和java的 ...

  3. 01_c语言再学习_基础部分(1)

    目录: 1.编译基础 2.c语言关键字 3.c语言数据类型 4.二进制/8进制/16进制 5.计算机内存数值存储方式:sizeof/原码/反码/补码 6.c语言中的字符和字符串 7.c语言中的数组和字 ...

  4. oc语言学习之基础知识点介绍(五):OC进阶

    一.点语法介绍 /* 以前封装后,要给属性赋值,必须调用方法 这样做,有两个缺点: 1.代码量多,调用方法要写的东西多. 2.看起来并不像是给属性赋值,也不像取值. 我们用点语法就可以更好的解决! 点 ...

  5. oc语言学习之基础知识点介绍(一):OC介绍

      一.第一个OC程序 #import <Foundation/Foundation.h> //导入头文件 int main(int argc, const char * argv[]) ...

  6. c语言学习之基础知识点介绍(四):算术运算符和逗号表达式

    本节主要介绍c语言中运算符. 运算符主要分为四类: 1.算术运算符 加(+),减(-),乘(*),除(/),取余(%,两数相除,得到余数) 2.关系运算符 3.逻辑运算符 4.换位运算符 下面将依次介 ...

  7. c语言学习之基础知识点介绍(三):scanf函数

    本节继续介绍c语言的基础知识点. scanf函数:用来接收用户输入的数据. 语法:scanf("格式化控制符",地址列表); 取地址要用到取地址符:&(shift+7) 例 ...

  8. c语言学习之基础知识点介绍(二):格式化控制符和变量的补充

    上节简单介绍了c语言中的一些基础知识点,本节将对之前介绍的不够详细的知识点进行补充. 格式化控制符的消息介绍: %d的其他控制符: 1.%md:m代表这个整数位占用多少位,m是一个整数.实际数字不足的 ...

  9. c语言学习之基础知识点介绍(一):输出语句和变量简单介绍

    本系列是为了学习ios做准备的,也能作为c语言入门的教程看看. c语言的程序结构: 1.顺序结构:自上而下依次执行. 2.分支结构:程序有选择的执行某段代码或者不执行某段代码. 3.循环结构:程序循环 ...

  10. C语言学习_一个简单程序的解释与C学习方法概括

    简单计算器程序示例: # include <stdio.h> //1.头文件 //2.加法函数 int add(int a,int b)//3.函数定义方式 { //4.函数体 retur ...

随机推荐

  1. java多线程之-CAS无锁-unsafe理解

    1.背景 这一节我们来学习一下unsafe对象 2.案例 1.自定义一个获取unsafe对象的类 package com.ldp.demo07Unfase; import sun.misc.Unsaf ...

  2. 【模板】最近公共祖先:LCA算法

    LCA最近公共祖先 \[\begin{align} 要求 \ 给出一个树和他的根节点\text{root} \quad给出Q个询问 回答\text {LCA}(a,b) \end{align} \] ...

  3. 018.CentOS升级内核

    一 更新yum源 1 [root@localhost ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org 2 [root@lo ...

  4. csv导入导出组件jcsv

    jcsv 介绍 jcsv一个简单的.轻量级的csv导入.导出库,相对于opencsv与javacsv,jcsv侧重于导入导出,包括导入校验.导出模板等. 源代码地址:https://gitee.com ...

  5. Cookie,Session Filter,Listener详解

    HTTP请求的无状态性 HTTP的无状态性是其一个重要的特征,指的是HTTP协议本身并不保留客户端与服务器交互的历史信息,换而言之,即每次的HTTP请求都是独立的,服务器在处理每一个请求时都不会记住前 ...

  6. LaTeX 编译 acmart 文档报错:hyperref must be loaded before hyperxmp.

    在编译一篇从 arXiv 下载的文档时遇到如下错误: Package hyperxmp Error: hyperref must be loaded before hyperxmp. 根据 GitHu ...

  7. 【爬虫实战】——利用bs4和正则表达式,简单实现爬取数据

    前言 好久没有写博客了,由于一直比较忙,感觉快荒废了学习的步伐,最近由于需要利用爬虫爬取数据,总结一下,以便以后查阅. 目录 一.bs4的安装 二.bs4解析器 三.定位查找标签 四.转换格式 五.提 ...

  8. 一个小小空格问题引起的bug

    程序员会遇到一种情况,一个bug排查到最后是由一个很小的问题导致的.在昨天的日常搬砖中遇到一个问题,耽搁了我大半天的时间,最后查明原因让我很无语. 首先介绍一下背景,我是做算法模型训练,目前手上的工作 ...

  9. 【YashanDB数据库】Ubuntu系统加载Yashan C驱动后无法使用PHP

    [问题分类]驱动使用 [关键字]驱动使用.PHP.Ubuntu.C驱动 [问题描述] 客户将YashanDB的C驱动lib加载到环境变量LD_LIBRARY_PATH后,PHP报错:PHP Fatal ...

  10. ARC119F 题解

    前言 ARC119F 好厉害,是没见过的自动机 DP. 正文 [1] 分析 主要分析一下为什么这么写. [2] 状态设计 [3] 自动机状态转移 感觉状态设计中最难的就是如何处理带 \(O\) 的. ...