golang学习笔记[1] 基础知识

前端之家收集整理的这篇文章主要介绍了golang学习笔记[1] 基础知识前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。


golang发现就很好玩。

很久没有写日志了,继续恢复吧。



  1. // one project main.go
  2. package main
  3.  
  4. import (
  5. "errors"
  6. "fmt"
  7. "math"
  8. "os"
  9. )
  10.  
  11. func main() {
  12.  
  13. /*
  14. Go语言基础类型
  15. 布尔类型:bool
  16. 整型:int,int8,int16,int32,int64,uint,uint8,uint16,uint32,uint64,byte,uintptr (一般使用int和unit就好啦)
  17. 浮点类型:float32,float64
  18.  
  19. 复数类型:complex64,complex128
  20. 字符串:string
  21. 字符类型:rune
  22. 错误类型:error
  23.  
  24. Go语言复合类型
  25. 指针 pointer
  26. 数组 array
  27. 切片 siice
  28. 字典 map
  29. 通道 chan
  30. 结构体 struct
  31. 接口 interface
  32. */
  33.  
  34. //声明一个叫v1的int类型变量,默认值为0
  35. var v1 int
  36. //声明的变量后就一定要使用(给这个变量赋值不算使用),不然编译的时候就会报错:.\main.go:7: v1 declared and not used
  37. fmt.Println(v1) //0
  38.  
  39. //在声明一个变量的同时初始化
  40. var v2 int = 10 //最标准的方法
  41. var v3 = 10 //编译器可以自动推导出v3的类型
  42. v4 := 10 //使用了:=运算符 编译器可以自动推导出v4的类型 ,推荐使用这种简洁明了的方式
  43. /*
  44. :=符号的左边变量不可以被声明过
  45. var i int
  46. i := 3
  47. 会报错:no new variables on left side of :=
  48. */
  49.  
  50. //字符串
  51. v5 := "大连"
  52. //数组
  53. v6 := [2]int{1,2}
  54. //数组切片
  55. v7 := []int{0,1,2,3}
  56. //结构体
  57. var v8 struct {
  58. one int
  59. two int
  60. }
  61. //给结构体两个数赋值
  62. v8.one = 520
  63. v8.two = 1314
  64. //指针,获取v1的地址
  65. var v9 *int = &v1
  66. //声明key为string,value为int的map
  67. var v10 map[string]int
  68. //初始化map
  69. v10 = make(map[string]int)
  70. v10["love"] = 1314
  71. v10["she"] = 1994
  72. //声明一个函数,参数为一个int,返回为一个int
  73. var v11 func(a int) int //输出 <nil>
  74. //使用var关键词连续定义多个变量
  75. var (
  76. v12 int
  77. v13 float32
  78. v14 float64
  79. )
  80. //使用多重赋值交换两数
  81. i := 6
  82. j := 9
  83. i,j = j,i
  84. fmt.Println(i,j) //9 6
  85. //使用匿名变量忽略函数多重返回值中的部分
  86. _,_,nickname := GetName() //_就为匿名变量
  87. fmt.Println("this nickname is",nickname) //this nickname is Moss
  88.  
  89. /*
  90. 字面量常量(literal),是指程序中硬编码的常量,例如:1126,7.9,true,"xuan"
  91. */
  92. //定义常量,常量的右值要为字面量常量或者编译期间预算的常量表达式
  93. const PI float64 = 3.14159265358979323846
  94.  
  95. /*
  96. 预定义常量
  97. GO语言预定义了这些常量:true,false,iota
  98. iota是一个可被编译器修改的常量,在每个const关键字出现时被重置为0,然后在下一个const出现之前,每出现一次iota,其所代表的数字会自动增加1
  99. */
  100. const (
  101. v15 = iota //iota被重置为0
  102. v16 = iota // v16 = 1
  103. v17 = iota // v17 = 2
  104. )
  105. //如果两个const的赋值语句的表达式是一样的,那么可以省略后一个赋值表达式
  106. const (
  107. v18 = 1 + iota
  108. v19
  109. v20
  110. )
  111.  
  112. //布尔类型不能接受其他类型的赋值,不能自动或者强制转换,否则会报错
  113. //bool test = "peixuan" //Syntax error: unexpected name,expecting semicolon or newline or }
  114.  
  115. //int和int32在Go语言里面被认为是两种语言,且不同类型的整型不能进行比较
  116. /*
  117. var v21 int32
  118. v22 := 2014 //v22被自动推断为int类型
  119. v21 = v22 //cannot use v22 (type int) as type int32 in assignment
  120. */
  121.  
  122. //复数
  123. var v21 complex64
  124. v21 = 3.2 + 12i //3.2实部 12虚部
  125. v22 := 3.3 + 13i
  126. v23 := complex(3.4,14) //3.4 + 14i
  127. fmt.Println("实部:",real(v23),"虚部:",imag(v23))
  128.  
  129. fmt.Println(v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16,v17,v18,v19,v20,v21,v22,v23)
  130.  
  131. //字符串
  132. v24 := "peixuan,佩璇"
  133. v25 := v24[0]
  134. //v24[0] = 'A' //cannot assign to v24[0]
  135. fmt.Printf("%s:%c\n",v24,v25)
  136. //遍历字符串
  137. //以字节数组遍历
  138. l := len(v24)
  139. for i := 0; i < l; i++ {
  140. ch := v24[i]
  141. fmt.Println(i,ch)
  142. }
  143. //以Unicode字符遍历
  144. //i 是index,ch 是value。
  145. for i,ch := range v24 {
  146. fmt.Println(i,ch)
  147. }
  148.  
  149. /*
  150. 数组是值类型,切片是引用类型
  151. */
  152. v26 := [10]int{1,3,4,5,6,7,8,9,10}
  153. for i,v := range v26 {
  154. fmt.Println(i,v)
  155. }
  156. //根据数组创建数组切片
  157. v27 := v26[:5] //前五个
  158. fmt.Println(v27) //[1 2 3 4 5]
  159. v28 := v26[5:] //从第五个开始到结束
  160. fmt.Println(v28) //[6 7 8 9 10]
  161. v29 := v26[3:7] //第三个到第七个
  162. fmt.Println(v29) //[4 5 6 7]
  163. v30 := v26[:] //所有数组
  164. fmt.Println(v30)
  165. //创建一个初始元素个数为5的数组切片,元素初始值为0,
  166. v31 := make([]int,5)
  167. fmt.Println(v31)
  168. //创建一个初始元素个数为5的数组切片,元素初始值为0,并预留是个元素的存储空间。
  169. v32 := make([]int,10)
  170. fmt.Println(v32)
  171. //直接创建并初始化包含5个元素的数组切片
  172. v33 := []int{1,5}
  173. fmt.Println(v33)
  174. //cap()函数可以获取切片的存储大小,len()可以获取切片中的个数多少
  175. fmt.Println("cap() is ",cap(v32),"len() is ",len(v32))
  176. //切片增加元素
  177. v33 = append(v33,11,12,13,14)
  178. fmt.Println(v33)
  179. //切片增加数组
  180. v33 = append(v33,v32...) //v32...相当于把所有元素拆成单个后当做参数传入
  181. fmt.Println(v33)
  182.  
  183. //map
  184. //定义lover结构体
  185. type Lover struct {
  186. Name string
  187. BirthDay string
  188. }
  189. //声明map变量she
  190. var she map[string]Lover
  191. //初始化she
  192. she = make(map[string]Lover)
  193. //往she中添加元素
  194. she["lpx"] = Lover{"liaopeixuan","1994.11.26"}
  195. //从这个map中查找zyx
  196. lover1,ok := she["zyx"]
  197. if ok {
  198. fmt.Println("you love is ",lover1.Name)
  199. } else {
  200. fmt.Println("zyx is not found!")
  201. }
  202. //查找lpx
  203. lover2,ok := she["lpx"]
  204. if ok {
  205. fmt.Println("you love is ",lover2.Name)
  206. } else {
  207. fmt.Println("lpx is not found!")
  208. }
  209. //删除键为"zyx"的键值对,如果改键不存在则不会执行任何东西
  210. delete(she,"zyx")
  211.  
  212. /*
  213. 流程控制
  214. 条件语句:if,else, else if
  215. 选择语句:switch, case, select
  216. 循环语句:for range
  217. 跳转语句:goto
  218. */
  219.  
  220. //条件语句
  221. if 3 > 6 {
  222. fmt.Println("3 > 6")
  223. } else if 2 > 6 {
  224. fmt.Println("2 > 6")
  225. } else {
  226. fmt.Println("else")
  227. }
  228. //选择语句
  229. sw := 2
  230. switch sw {
  231. case 1:
  232. fmt.Println("case 1")
  233. case 2:
  234. fmt.Println("case 2")
  235. case 3:
  236. fallthrough
  237. case 4:
  238. fmt.Println("case 4")
  239. default:
  240. fmt.Println("default")
  241. }
  242. /*
  243. case后面不需要像C语言一样写breeak防止一直向下执行,只有case中遇见fallthrough才会继续向下执行
  244. 当sw=1 case 1
  245. 当sw=2 case 2
  246. 当sw=3 case 4
  247. 当sw=4 case 4
  248. 当sw=5 defalut
  249. */
  250.  
  251. //switch后面的表达式不是必须的
  252. switch {
  253. case 1 > 3:
  254. fmt.Println("1 > 3")
  255. case 1 < 3:
  256. fmt.Println("1 < 3")
  257. }
  258.  
  259. //循环语句
  260. for i := 0; i < 10; i++ {
  261. fmt.Println(i)
  262. }
  263. //for无限循环
  264. count := 0
  265. for {
  266. count++
  267. if count < 100 {
  268. continue
  269. } else if count > 100 {
  270. fmt.Println("count is ",count)
  271. break
  272. }
  273. }
  274. JLoop:
  275. for i := 0; i < 10; i++ {
  276. fmt.Println("label i is ",i)
  277. for j := 0; j < 10; j++ {
  278. if j > 5 {
  279. //跳到外面去啦,但是不会再进来这个for循环了
  280. break JLoop
  281. }
  282. }
  283. }
  284.  
  285. //跳转语句 goto语句可以跳转到本函数内的某个标签
  286. gotoCount := 0
  287. GotoLabel:
  288. gotoCount++
  289. if gotoCount < 10 {
  290. goto GotoLabel //如果小于10的话就跳转到GotoLabel
  291. }
  292.  
  293. myfunc(999,998,997)
  294. anyfunc(1,"love",3.6)
  295.  
  296. //把匿名函数赋值给一个变量
  297. f := func(str string) {
  298. fmt.Println(str)
  299. }
  300. f("i love peixuan")
  301. //立刻执行匿名函数
  302. func(str string) {
  303. fmt.Println(str)
  304. }("i love peixuan right now") //()里面的就是传入的参数
  305.  
  306. //函数闭包
  307. out := 100
  308. afunc := func() func() {
  309. in := 10
  310. return func() {
  311. fmt.Println("out is ",out,"in is ",in)
  312. }
  313. }()
  314. //panic("nothing")
  315. rec := recover()
  316. fmt.Println(rec)
  317. afunc()
  318.  
  319. //fmt.Println(a.(type)) //use of .(type) outside type switch
  320.  
  321. //cap 的增长模式 1 2 4 8 16 32 64 128 ……
  322. testarr := make([]int,1)
  323. for i := 0; i < 1000; i++ {
  324. fmt.Println(cap(testarr),len(testarr))
  325. testarr = append(testarr,i)
  326. }
  327. }
  328.  
  329. /*
  330. 小写字母开头的函数只能在本包可见,大写字母开头的函数才能被其他包使用。
  331. */
  332.  
  333. //如果该函数抛出异常,defer后的语句仍然会被执行。
  334. func CopyFile(dst,src string) (w int64,err error) {
  335. srcFile,err := os.Open(src)
  336. if err != nil {
  337. return
  338. }
  339.  
  340. defer srcFile.Close()
  341.  
  342. return w,nil
  343. }
  344.  
  345. func Add(a,b int) (ret int,err error) {
  346. if a+b > 100 {
  347. //如果加起来大于100的话就抛出异常
  348. err = errors.New("sun must under 100")
  349. return
  350. }
  351. return a + b,nil
  352. }
  353.  
  354. //不定参数的函数
  355. func myfunc(args ...int) {
  356. for _,arg := range args {
  357. fmt.Println(arg)
  358. }
  359. }
  360.  
  361. //任何类型不定参数
  362. func anyfunc(args ...interface{}) {
  363. for _,arg := range args {
  364. switch arg.(type) {
  365. case int:
  366. fmt.Println("this int is ",arg)
  367. case string:
  368. fmt.Println("this string is ",arg)
  369. default:
  370. fmt.Println("not found type ")
  371. }
  372. }
  373. }
  374.  
  375. func GetName() (fistName,lastName,nickName string) {
  376. return "Zhou","Yunxuan","Moss"
  377. }
  378.  
  379. //浮点数比较
  380. func IsEqual(f1,f2,p float64) bool {
  381. return math.Abs(f1-f2) < p
  382. }






文章出自于 http://blog.csdn.net/zhouyunxuan

猜你在找的Go相关文章