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. R包pheatmap:用参数一步步详细绘制热图

    经常会想到用热图来展示某个基因或某些基因的表达量问题,今天用R中pheatmap包一步步绘制热图. 第一步:公众路径设置,调用包pheatmap,读取目的文件,查看文件. 1 rm(list=ls() ...

  2. SMU 2024 spring 天梯赛自主训练1

    SMU 2024 spring 天梯赛自主训练1 7-1 宇宙无敌大招呼 - SMU 2024 spring 天梯赛自主训练1 (pintia.cn) #include <bits/stdc++ ...

  3. 如何实现基于Cortex-A9 的UART裸机驱动

    前言 Uart在一个嵌入式系统中是一个非常重要的模块,他承担了CPU与用户交互的桥梁.用户输入信息给程序.CPU要打印一些信息给终端都要依赖UART. 本文将以Exynos4412的UART控制器为基 ...

  4. vue 根据div id 滚动到指定view到可视视图中

    <div id="name" @click="scrollToViewById('name')"> ...... </div> scro ...

  5. ocelot 从15.x版本升级到16.x版本 UnableToFindDownstreamRouteError Message: Failed to mat ch Route configuration for upstream path

    项目里面用到 ocelot ,之前老的项目用的是 15.x 最近要一个新项目也要用到,直接安装了最新的16.x,结果死活都匹配不到上游路径. 刚开始以为是自己代码写得有问题,各种找问题,结果后来把oc ...

  6. THREE.JS中 CubeTextureLoader 使用避坑

    最近在跟着教程学THREE.JS,毕竟在现在的前端开发市场上,THREE.JS太火爆了. 今天学到"纹理"这一块的时候,跟着教程敲代码,发现自己的没有正确显示,百思不得其解,打开控 ...

  7. 单个48TB大小SQL Server数据库备份导致日志文件无法截断

    单个48TB大小SQL Server数据库备份导致日志文件无法截断 SQL Server 版本:SQL Server 2019背景在一个48T大小的单数据库环境中,采用简单恢复模式,日志文件大小限制为 ...

  8. 【SpringBoot Demo】MySQL + JPA + Hibernate + Springboot + Maven Demo

    主要包含:springboot+jpa+hibernate+mysql+lombok (两年前写过一个,现在重新记录一个) 1. 目录结构: 2. pom 文件 1 <?xml version= ...

  9. 手脱upx

    其实已经是大一下刚开始的事情了,补个档 手动脱壳の新年快乐 查壳,有壳,UPX X32dbg打开文件,查看初始断点 点击PUSHAD跟进,CTRL+*设置EIP,开始F8步过,寻找ESP寄存器第一次单 ...

  10. vue-i18n 8.28.2(完成)

    https://kazupon.github.io/vue-i18n/zh/introduction.html 开始 如果使用模块系统 (例如通过 vue-cli),则需要导入 Vue 和 VueI1 ...