Golang基础学习总结
转自:http://blog.csdn.net/yue7603835/article/details/44264925
func funca(a int){
}
func main() {
args := os.Args
if args == nil || len(args) < {
return
}
}
export GOPATH=~/goyard/calcproj
var a int = 等价 a:=
var v1 int = // 正确的使用方式1
var v2 = // 正确的使用方式2,编译器可以自动推导出v2的类型
v3 := // 正确的使用方式3,编译器可以自动推导出v3的类型
func GetName() (firstName, lastName, nickName string) {
return "May", "Chan", "Chibi Maruko"
}
_, _, nickName := GetName()
const Pi float64 = 3.14159265358979323846
const zero = 0.0 // 无类型浮点常量
const (
size int64 =
eof = - // 无类型整型常量
)
const u, v float32 = , // u = 0.0, v = 3.0,常量的多重赋值
const a, b, c = , , "foo"
// a = 3, b = 4, c = "foo", 无类型整型和字符串常量
const mask = <<
const Home = os.GetEnv("HOME")
重置为0,然后在下一个const出现之前,每出现一次iota,其所代表的数字会自动增1。
const ( // iota被重设为0
c0 = iota // c0 == 0
c1 = iota // c1 == 1
c2 = iota // c2 == 2
)
const (
a = << iota // a == 1 (iota在每个const开头被重设为0)
b = << iota // b == 2
c = << iota // c == 4
)
const (
u = iota * // u == 0
v float64 = iota * // v == 42.0
w = iota * // w == 84
)
const x = iota // x == 0 (因为iota又被重设为0了)
const y = iota // y == 0 (同上)
const ( // iota被重设为0
c0 = iota // c0 == 0
c1 // c1 == 1
c2 // c2 == 2
)
const (
a = <<iota // a == 1 (iota在每个const开头被重设为0)
b // b == 2
c // c == 4
)
const (
Sunday = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
numberOfDays // 这个常量没有导出
)
var v1 bool
v1 = true
v2 := ( == ) // v2也会被推导为bool类型
var b bool
b = // 编译错误
b = bool() // 编译错误
var b bool
b = (!=) // 编译正确
fmt.Println("Result:", b) // 打印结果为Result: true
if i!=j { } //必须带大括号
i,j:=,
if i==j{
fmt.Println("i==j");
}else {
fmt.Println("i!=j");
}
var a int8
var b int16
a,b=,
if int16(a)==b{
fmt.Printf("a==b")
}
var a int16
if a=={
fmt.Printf("a!=\"a\"");
}
表 -
运 算 含 义 样 例
x << y 左移 << // 结果为496
x >> y 右移 >> // 结果为31
x ^ y 异或 ^ // 结果为126
x & y 与 & // 结果为0
x | y 或 | // 结果为126
^x 取反 ^ // 结果为-3 =
采用IEEE-754标准的表达方式。
1. 浮点数表示
Go语言定义了两个类型float32和float64,其中float32等价于C语言的float类型,
float64等价于C语言的double类型。
在Go语言里,定义一个浮点数变量的代码如下:
var fvalue1 float32 fvalue1 =
fvalue2 := 12.0 // 如果不加小数点,fvalue2会被推导为整型而不是浮点型
对于以上例子中类型被自动推导的fvalue2,需要注意的是其类型将被自动设为float64,
而不管赋给它的数字是否是用32位长度表示的。因此,对于以上的例子,下面的赋值将导致编译
错误:
fvalue1 = fvalue2
import "math" // p为用户自定义的比较精度,比如0.00001
func IsEqual(f1, f2, p float64) bool {
return math.Fdim(f1, f2) < p
}
var v1 complex64
v1 = 2.5+15i
v2 := 2.5+15i
v3 :=complex(2.5,)
fmt.Println(v1)
fmt.Println(v2)
fmt.Println(v3)
fmt.Println("real:",real(v1))
fmt.Println("real:",imag(v1))
复数实际上由两个实数(在计算机中用浮点数表示)构成,一个表示实部(real),一个表示虚部(imag)。
对于什么是复数可以参考:http://baike.baidu.com/view/10078.htm
复数实际上由两个实数(在计算机中用浮点数表示)构成,一个表示实部(real) ,一个表示
虚部(imag) 。如果了解了数学上的复数是怎么回事,那么Go语言的复数就非常容易理解了。
1. 复数表示
复数表示的示例如下:
var value1 complex64 // 由2个float32构成的复数类型 value1 = 3.2 + 12i
value2 := 3.2 + 12i // value2是complex128类型 value3 := complex(3.2, ) // value3结果同 value2
2. 实部与虚部
对于一个复数z = complex(x, y),就可以通过Go语言内置函数real(z)获得该复数的实
部,也就是x,通过imag(z)获得该复数的虚部,也就是y。
更多关于复数的函数,请查阅math/cmplx标准库的文档。
var str string
str = "abc"
str += "d"
str=""
fmt.Println(str)
var str string
str = "abc"
str += "d"
ch:=str[]
fmt.Printf("A:%c",ch) //println不能格式化
var str string
str = "abcdefghijklmn"
var length int8=int8(len(str))
for i:= ;i<int(length) ;i++{
fmt.Printf("%c",str[i])
}
str := "Hello,世界"
for i, ch := range str {
fmt.Println(i, ch)//ch的类型为rune
}
package main
import "fmt"
func main() {
var strUnicode string = "hello,世界"
for i,ch := range strUnicode{
fmt.Println(i,ch)
}
}
package main
import "fmt"
func main() {
var strUnicode string = "hello,世界"
for _,ch := range strUnicode{
fmt.Printf("%c\n",ch)
}
}
package main
import "fmt"
func main() {
var inta int8= ;
var pinta*int8=&inta ;
fmt.Printf("%d",*pinta);
}
package main
import "fmt"
func main() {
byteArr:=[]byte{,,,,}
for _,val:=range byteArr {
fmt.Println(val)
}
}
//////////////////////////////////各种数组的声明/////////////////////////////////
[]byte // 长度为32的数组,每个元素为一个字节
[*N] struct { x, y int32 } // 复杂类型数组
[]*float64
// 指针数组 [3][5]int
// 二维数组 [2][2][2]float64
// 等同于[2]([2]([2]float64)) /////关于二维数组的初始化以及声明..................................
package main
import "fmt"
func main() {
td:=[][]int{{,,,,},{,,,,}}
for _,val:=range td{
for _,vall:=range val{
fmt.Println(vall)
} }
}
package main
import "fmt"
func modify(arr[]int){
arr[]=
fmt.Printf("arr[1]=%d\n",arr[])
}
func main() {
td:=[]int{,,,,}
modify(td)
for _,val:=range td{
fmt.Println(val)
}
}
//////Go Web
package main
import "fmt"
func modify(arr[]int){
arr[]=
fmt.Printf("arr[1]=%d\n",arr[])
}
func main() {
td:=[]int{,,,,}
//基于数组创建切片
slice:=td[:] // td[:] td[begin:end] 都可以创建数组切片 还可以创建一个比数组还大的切片
for _,val:=range slice{
fmt.Println(val)
}
}
td:=[]int{,,,,} //这样创建出来的实际上是数组切片
package main
import "fmt"
func modify(arr[]int){
arr[]=
fmt.Printf("arr[1]=%d\n",arr[])
}
func main() {
td:=[]int{,,,,}
//基于数组创建切片
slice:=td[:] //从切片创建切片 都可以
modify(slice)
for _,val:=range slice{
fmt.Println(val)
}
}
slice1 := []int{, , , , }
slice2 := []int{, , } copy(slice2, slice1) // 只会复制slice1的前3个元素到slice2中
copy(slice1, slice2) // 只会复制slice2的3个元素到slice1的前3个位置 old:=[]int{,,,,,}
newSlice:=[]int{,,}
copy(old,newSlice)
fmt.Println(old)
myMap = map[string] PersonInfo{
"": PersonInfo{"", "Jack", "Room 101,..."},
}
package main
import "fmt"
type Info struct{
name string
age int8
}
func main() {
var infoMap map[string] Info
infoMap=make(map[string] Info)
infoMap["s1"]= Info{"ydw",}
infoMap["s2"]=Info{"xxx",}
fmt.Println(infoMap)
/////如果sone 没有查找到那么返回值应该是nil 实际上我们只需要判断 ok是否是 true or false 即可判断元素是否查找到
sone,ok:=infoMap["s1"]
if ok {
fmt.Println("s1 student info exists!",sone.name,":",sone.age)
}else{
fmt.Println("s1 student info not exists!")
}
}
/////删除一个map用
delete(map,"key")
func returnFunc(num int) int{
if num > {
return //错误 返回值不能写在if...else之中结构之中
}
return
}
switch i {
case :
fmt.Printf("")
case :
fmt.Printf("")
case :
fallthrough
case :
fmt.Printf("")
case , , :
fmt.Printf("4, 5, 6")
default:
fmt.Printf("Default")
}
type Info struct{
name string
age int8
}
package main
import "fmt"
func ret1() int{
return
}
func ret2()(a int,b int){
a,b=,
return
} func main() {
a,b:=ret2()
fmt.Println(ret1(),a,b)
}
package main
import "fmt"
func show(args ...int){
for _,val:= range args{
fmt.Println(val)
}
}
func main() {
show(,,)
}
unc myfunc(args ...int) {
// 按原样传递
myfunc3(args...)
// 传递片段,实际上任意的int slice都可以传进去
myfunc3(args[:]...)
}
package main
import "fmt"
func Printfx(args ...interface{}) {
for _,val:= range args{
fmt.Println(val)
}
}
func main() {
Printfx(,,,"adsd","sdaddf")
}
package main
import "fmt"
func show(args ...int){
for _,val:= range args{
fmt.Println(val)
}
}
// ...
func Printfx(args ...interface{}) {
for _,val:= range args{
fmt.Println(val)
}
}
func main() {
Printfx(,,,"adsd","sdaddf")
slice:=[]int{,,,,,,}
show(slice...)
}
package main
import "fmt"
func checkType(args...interface{}){
for _,val:=range args{
switch val.(type){
case int :
fmt.Println("Type is int!")
case string:
fmt.Println("Type is string!")
default:
fmt.Println("Type is unknow!")
}
}
}
func main() {
checkType(,,,"aaaa",int64())
}
///定义匿名函数 并且调用
funAdd:=func(a,b int)int{
return a+b
}
r:=funAdd(,)
fmt.Println("a+b=",r)
////定义 +调用匿名函数 一起
r=func(a,b int)int{
return a-b
}(,)
fmt.Println("a+b=",r)
////Go闭包 通过函数创建匿名函数 并且返回函数
package main
import "fmt"
func createFunc()(func(aa,bb,cc int) int){
return func(aa,bb,cc int)int{
return aa+bb+cc
}
}
func main() {
add:=createFunc()
addNum:=add(,,)
fmt.Println("addNum:",addNum)
} package main import ( "fmt"
)
///////函数的闭包定义 直接调用 .......闭包内部使用的代码块外部的变量 只要代码块没有释放那么变量不会被释放的
func main() {
var j int =
a := func()(func()) {
var i int =
return func() {
fmt.Printf("i, j: %d, %d\n", i, j)
}
}()
a()
j *=
a()
}
func ret()(int,int){
return ,
}
a,b:=ret()
fmt.Println("a,b=",a,b)
package main
import "fmt"
type Data struct{
name string
age int
}
func main() {
data:=Data{"a",}
fmt.Println(data)
}
///////////////////给结构体起个别名
package main
import "fmt"
type Data struct{
name string
age int
}
type DData Data
func main() {
data:=DData{"a",}
fmt.Println(data)
}
func CopyFile(dst, src string) (w int64, err error) {
srcFile, err := os.Open(src)
if err != nil {
return
}
defer srcFile.Close()
dstFile, err := os.Create(dstName)
if err != nil {
return
}
defer dstFile.Close()
return io.Copy(dstFile, srcFile)
}
defer func() {
// 做你复杂的清理工作
} ()
////panic场景1
package main
import "fmt"
func main() {
defer func(){
fmt.Println("hello,defer go")
}()
panic()
}
////recover场景2
package main
import "fmt"
func main() {
defer func(){
fmt.Println("hello,defer go")
}()
panic()
}
panic()
panic("network broken")
panic(Error("file not exists"))
defer func() {
if r := recover(); r != nil {
log.Printf("Runtime error caught: %v", r)
}
}()
foo()
package main
import "fmt"
func main() {
//通过闭包定义 defer匿名函数 并且直接调用
defer func(){
//recover 结束当前错误处理过程 并且返回 panic的参数,并不结束其他goroutine的执行.......
if r:=recover() ;r!=nil{
fmt.Println("recover() called!")
}
fmt.Println("hello,defer go")
}()
panic("hello,go")
}
package main
import "fmt"
var str string="aaa"
const(
A=iota
B
C
)
func main() {
fmt.Println(B)
defer func(){
if r:=recover() ;r!=nil{
fmt.Println("recover() called!")
fmt.Println(r)
}
fmt.Println("hello,defer go")
}()
panic("hello,go")
}
package main
import "fmt"
import "math/rand"
/////冒泡排序Go实现 时间复杂富 O(n)=n~n^2
func bubbledSort(values []int){
var flags bool =true
for i:= ;i<len(values);i++{
flags=true
for j:=;j<len(values)-i-;j++{
if values[j]>values[j+] {
values[j],values[j+]=values[j+],values[j]
flags=false
}
}
if flags {
break
}
}
}
///////快速排序Go实现
func quickSort(values []int,left,right int){
temp := values[left]
p := left
i, j := left, right
for i <= j {
for j >= p && values[j] >= temp {
j--
}
if j >= p {
values[p] = values[j]
p = j
}
if values[i] <= temp && i <= p {
i++
}
if i <= p {
values[p] = values[i]
p = i
}
}
values[p] = temp
if p - left > {
quickSort(values, left, p - )
}
if right - p > {
quickSort(values, p + , right)
}
}
func main() {
//创建初始化0个元素 容量1000的 切片 如果用索引直接访问切片会越界的 容量必须大于等于 初始化元素个数
//val[1]=11
val:=make([]int,,)
for i:=;i<;i++{
val=append(val,rand.Intn())
}
fmt.Println("冒泡排序前:",val)
bubbledSort(val)
fmt.Println("冒泡排序后:",val)
}
Golang基础学习总结的更多相关文章
- golang基础学习及web框架
golang的web框架 web框架百花齐放:对比 Go Web 编程 Go Web Examples Golang 适合做 Web 开发吗? beego beego简介 go-restful gol ...
- golang基础学习---log
package main import ( "log" ) func init() { log.SetPrefix("TRACE: ") log.SetFlag ...
- golang基础学习-MongoDB使用
1.系统环境 Golang:go version go1.10.3 darwin/amd64 OS:MacOS MongoDB: version: 3.4.4 2.Golang使用MongoDB 使用 ...
- golang基础学习
一.输出hello,world程序 package main; import "fmt"; func main() { fmt.Printf("hello,world&q ...
- Golang 基础学习笔记(2)| 如何安装Go工具
可参考官网:http://docscn.studygolang.com/doc/install#安装 1.OS要求 gc 编译器支持以下操作系统及架构.在开始前,请确保你的系统满足这些需求. 若你的O ...
- golang基础学习-strings包常用函数学习
package main import ( "fmt" "strings" ) //StrFunc 字符串说明 func main() { var testSt ...
- Golang 汇编asm语言基础学习
Golang 汇编asm语言基础学习 一.CPU 基础知识 cpu 内部结构 cpu 内部主要是由寄存器.控制器.运算器和时钟四个部分组成. 寄存器:用来暂时存放指令.数据等对象.它是一个更快的内存. ...
- GoLang基础数据类型--->字符串处理大全
GoLang基础数据类型--->字符串处理大全 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 欢迎加入: 高级运维工程师之路 59843264 ...
- go语言基础学习
go基础学习,面向对象-方法在Go语言中,可以给任意自定义类型(包括内置类型,但不包括指针类型)添加相应的方法 使用= 和:=的区别: // = 使用必须使用先var声明例如: var a a=100 ...
随机推荐
- python 字典的合并
d1 = {, } d2 = {, } d = d1.copy() d.update(d2) print(d)
- Java线程池Executor使用
合理利用线程池能够带来三个好处.第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗.第二:减少系统对于,外部 服务的响应时间的等待.第三:提高线程的可管理性.线程是稀缺资源,如果 ...
- windows 上 Python 通过 SCP 连接linux server
环境搭建 需要安装以下包 pycrypto (需要VC编译环境) paramiko (SSH的基础) scpclient-0.4 (paramiko 上的一个wrapper) 在安装pycrypto ...
- baseCss/resetCss(转)
原文链接:https://github.com/hangyangws/baseCss#basecss baseCss 意义 统一各个浏览器差异.统一团队开发起始标准.弥补浏览器的“缺点”.提供频繁使用 ...
- UVA-1152 4 Values whose Sum is 0 (二分)
题目大意:在4个都有n个元素的集合中,每个集合选出一个元素,使得4个数和为0.问有几种方案. 题目分析:二分.任选两组求和,剩下两组求和,枚举第一组中每一个和sum,在第二组和中查找-sum的个数,累 ...
- type使用细则
CREATE OR REPLACE TYPE ADDRESS_TYPE --创建类型 ADDRESS_TYPE AS OBJECT(ZIP VARCHAR2(6),PROVINCE VARCHAR ...
- 动态创建OATipBean
动态创建OATipBean. 动态创建的OATipBean无法直接设置提示内容,需要添加一个静态文本. 参考User Guide示例如下. If you need to create a tip pr ...
- MySQL多表关联查询与存储过程
-- **************关联查询(多表查询)**************** -- 需求:查询员工及其所在部门(显示员工姓名,部门名称) -- 1.1 交叉连接查询(不推荐.产生笛卡尔乘积 ...
- 转载 ORACLE中实现表变量的方法
源文地址:http://blog.itpub.net/750077/viewspace-2134222/ 经常看到SQLSERVER 中用表变量类型的方式就能做到缓存一个比较大的中间结果, 然后再对这 ...
- linux 网络测试命令 长期更新
一.网络测试命令 1.测试 网络连接 发送两包后停发 [oracle@hadoop ~]$ PING www.a.shifen.com (() bytes of data. bytes from tt ...