golang一些知识点
2.冒泡排序(二维数组使用):
func main() {
i := 1
MYLABEL:
for {
i++
if i > 3 {
break MYLABEL
}
}
fmt.Println("MYLABEL")
}
// Label名称随意,必需写在for循环前面
2.冒泡排序(数组使用):
func main() {
var arr [6]int = [6]int{1, 9, 8, 500, 45, 2}
arrSize := len(arr)
for i := 0; i < arrSize; i++ {
//fmt.Println(arr)
for j := i; j < arrSize; j++ {
if arr[i] < arr[j] {
tmp := arr[i]
arr[i] = arr[j]
arr[j] = tmp
}
}
}
fmt.Println(arr)
}
3.slice扩容引起的问题:
切片的数据结构:

slice在扩容会生成一个新的slice,再将原来的slice拷贝到新的slice,然后append.这将导致元素的地址发生变化.
示例:
func main() {
slice := make([]int, 2, 5)
slice[0] = 10
slice[1] = 20
fmt.Printf("%p\n", slice)
slice = append(slice, 1, 2, 5, 6)
fmt.Printf("%p", slice)
}
因为有扩容,两次打印的slice数组的地址不一致.
slice作为函数参数时,传递了一个引用,我们append一个元素后,期望得到增加元素的slice,但事实上并没有:
func main() {
slice := make([]int, 0)
changeSlice(slice)
fmt.Println(slice)
}
func changeSlice(slice []int) {
slice = append(slice, 10)
}
// 输出: [],并没有增加元素这是因为切片扩容,导致了数组地址发生了变化.
所以应该将以上代码改为让其返回slice,并赋值:
func main() {
slice := make([]int, 0)
slice = changeSlice(slice)
fmt.Println(slice)
}
func changeSlice(slice []int) []int {
slice = append(slice, 10)
return slice
}
4.switch type的一个例子:
type Phone interface {
Call()
}
type Android struct {
name string
}
func (android *Android) Call() {
fmt.Println(android.name)
}
func main() {
android := &Android{name: "LG"}
HangUp(android)
}
func HangUp(all Phone) {
switch v := all.(type) {
case *Android:
fmt.Println("HangUp", v.name)
default:
fmt.Println("unknow device")
}
}
使用断言:
func HangUp(all Phone) {
if a, ok := all.(*Android); ok {
fmt.Println(a.name)
return
}
fmt.Println("unknow device")
}
5.fallthrough:
fallthrough强制执行后面的case代码,fallthrough不会判断下一条case的expr结果是否为true
func main() {
a := 1
switch a {
case 1:
fmt.Println("1")
fallthrough
case 2:
fmt.Println("2")
default:
fmt.Println("no match")
}
}
// 输出1 2, 第二个case并没有判断a是不是等于2
6.goroutine同步:sync
import (
"fmt"
"runtime"
"sync"
) func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
wg := sync.WaitGroup{}
wg.Add(10)
for i := 0; i < 10; i++ {
go work(&wg, i)
}
wg.Wait()
} func work(wg *sync.WaitGroup, index int) {
fmt.Println(index)
wg.Done()
}
golang一些知识点的更多相关文章
- golang 特殊知识点
golang 代码不需要分号; 但是又会自己在底层增加;号 ,所以 golang的{左花括号必须在代码的最后一行,而不能在新的一行; golang 代码组织里需要注意 vendor 和 interna ...
- golang 小知识点记录
获取url中的参数及输出到页面的几种方式 func SayHello(w http.ResponseWriter, req *http.Request) { req.Method //获取url的方法 ...
- Golang 知识点总结
Golang 知识点总结 目录 [−] 各种类型复制的时候的花费 可使用内建函数的类型 (len.cap.close.delete.make) 内建容器类型的值比较 组合类型T{...}的值比较 零值 ...
- Golang知识点整理
1. Golang 1.1 golang知识点大纲 1.2 指针 1.3 Golang使用validator进行数据校验及自定义翻译器 1.4 Golang GC(垃圾回收机制) 2.框架 2.1 G ...
- Golang 数组 切片 字典 基本知识点
数组 数组的声明 var arrayName [arraySize]dataType eg: var array1 [5]int 在声明数组时,必须指定数组名,数组长度和数组元素的类型. 数组的初始化 ...
- 来自朝鲜的问候 golang入坑系列
鸿渐于陆 本想着写满十八式,但按照目前的进度来看,是很难凑够十八式了.所以还是那句话,量力而行,适可而止.能写多少就写多少,我没法保证看完这本golang脱口秀,一定能成为golang大拿.但入了门, ...
- Golang的CSP很酷?其实.NET也可以轻松完成
说起Golang(后面统称为Go),就想到他的高并发特性,在深入一些就是 Goroutine.在大家被它优雅的语法和简洁的代码实现的高并发程序所折服时,其实C#/.NET也可以很容易的做到.今天我们来 ...
- golang使用通道模仿实现valatile语义
golang团队在sync中提供了很多的原子操作函数,将原子操作转向由单独一个包提供,而不是像Java那样提供各种累,确实上手得更加简单.但是golang原生提供的并发操作没有Java来得丰富 ...
- golang 中 string 转换 []byte 的一道笔试题
背景 去面试的时候遇到一道和 string 相关的题目,记录一下用到的知识点.题目如下: s:="123" ps:=&s b:=[]byte(s) pb:=&b s ...
随机推荐
- codechef AUG17 T2 Chef and Mover
Chef and Mover Problem Code: CHEFMOVR Chef's dog Snuffles has so many things to play with! This time ...
- 莫队 [洛谷2709] 小B的询问[洛谷1903]【模板】分块/带修改莫队(数颜色)
莫队--------一个优雅的暴力 莫队是一个可以在O(n√n)内求出绝大部分无修改的离线的区间问题的答案(只要问题满足转移是O(1)的)即你已知区间[l,r]的解,能在O(1)的时间内求出[l-1, ...
- 明远智睿IMX6Q Android4.4.2移植USBWIFI(RTL8188EUS)
移植过程中得到网友的不少帮助,很感谢!为了让更多的网友不像我这样折腾,特写此文以做参照.过程中主要参考< Realtek_Wi-Fi_SDK_for_Android_KK_4_4.pdf > ...
- kubernetes 搭建集群外部ip服务
nginx-pod.yaml apiVersion: v1 kind: Pod metadata: name: webapp labels: app: webapp spec: containers: ...
- 你不一定知道的、并没有什么卵用的一些python库
1. delorean,用来处理时间的库 import datetime import pytz # 一般情况下,我们想表示时间的话 est = pytz.timezone("Asia/Sh ...
- windows 2012(64位) IIS配置asp程序 500 - 内部服务器错误。您查找的资源存在问题,因而无法显示。
在网上找了很久,包括常规的设置父路径之类的,一直都不可以,搞了一晚上毫无成就感,第二天早上无意中看到一篇文章,说到点子上了,非常感谢.源地址已经找不到了,我把大概的问题截图说明一下. 方法如下:1.打 ...
- 【linux高级程序设计】(第十三章)Linux Socket网络编程基础
IP地址定义: struct in_addr{ __u32 s_addr; }; in_addr_t inet_addr (__const char * __cp) :把点分十进制IP地址字符串转换 ...
- php7简短而安全的数组遍历方法
在写 PHP 的数组遍历的时候,我们通常会这样写: foreach ($definition['keys'] as $id => $val) { // ... } 但是其实这样会引起一个重要的问 ...
- TreeSet与TreeMap排序
1.TreeSet原理: /* * TreeSet存储对象的时候, 可以排序, 但是需要指定排序的算法 * * Integer能排序(有默认顺序), String能排序(有默认顺序), 自定义的类存 ...
- 每天一个Linux命令(10)cp命令
cp命令用来将一个或多个源文件或者目录复制到指定的目的文件或目录.它可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在的目录下.cp命令还支持同时复制多个文件,当一次复制多个文件时,目标文 ...