interface 分两种空接口(eface)和非空接口(有方法定义的接口)type eface struct {_type *_type // 具体类型信息的指针
data unsafe.Pointer // 指向实际存储的数据}也就是定义了指向位置的指针和指向类型的指针。例子:var i interface{}i = 42_type 指向 int 的类型信息。data 存放
今天面试的时候,面试问我golang 如何实现继承。我直接说golang中只有组合,想实现类似继承的效果的话。就是struct嵌套struct 这种比较靠谱
用golang读取一个json,发现有一个字段的值有的是int类型,有的是string类型。解决思路就是自定义一个类型,然后解析json的时候,自定义函数进行判断。type StringOrInt stringfunc (s *StringOrInt) UnmarshalJSON(data []byte) error {// 尝试解析为字符串
var str string
if err :=
思想就是用循环数组来实现整个结构。其中numSlots用来表示滑动窗口的持续时间,比如30s,间隔时间是1s执行一次,这个可以用goroutine起一个定时器实现。计数就用golang atmic 实现,这个具有原子性。每一次步进就是(curIndex+1)%numSlots 下边就是相关代码。package service
import (
"fmt"
十进制转化为二进制就是取余的值,从右向左排序除 2 取余法例子:
用 4 除 2,记录余数:4÷2=2 余 0
用 2 除 2,记录余数:2÷2=1 余 0
用 1 除 2,记录余数:1÷2=0 余 1
获得值 100
-----------
用 5 除 2,记录余数:5÷2=2 余1
用 2 除 2,记录余数:2÷2=1 余0
用 1 除 2,记录余数:2÷2=0 余1
在goim ring代码中,有位运算&的操作。然后这就引发了一个疑问,为什么不用取模这是因为,在cpu层面,%不是一个便宜的操作,它通常被翻译成除法运算,而除法运算相对于其他运算是比较慢的。 idx := i % num 除法操作 通常比加/位运算慢一个数量级。所以就完全可以用下边代替,这个前提条件是num是2的幂(2, 4, 8, 16 …) idx := i & (num - 1)2 的
1.首先就是初始化discovery,然后创建与其他服务通信的gprc客户端。2.然后把其作为参数传入长链接中。接下来就是初始化黑名单,这个是非核心业务,暂时忽略。然后就是创建tcp 和 websocket 服务。addrs 就是不同的地址,创建多个tcp服务。接下来就是apue 讲的怎么创建服务器。1.bind 端口2.listen 监听端口3.accept 接受连接,这里边是阻塞的,所以可以用
tcp 所谓的分包拆包问题,其实更规范的说法,tcp是流的形式,那么就存在边界问题。而解决边界问题的方案大概有两种,一种定义包头和包体。另外一种就是尾部标识符问题。下边定义下伪代码,其实parse就是用来处理tcp的边界问题。 var buffer bytes.Buffer
for {
// 1. 从 TCP 连接里读取数据
tmp := mak
现在需求是读取一批图片,然后批量上传到七牛云。现在是第一版,思路就是起5个携程,然后对图片列表进行遍历循环,如果携程数使用超过5个就阻塞代码。这里用到channel 信号量限流作用,就是往channel 写数据,如果channel 满了,就阻塞channel,直到对向从channel里边把数据读取了。 const maxGoroutines = 5
guard := make(ch
golang 安装私有包是需要账户密码的这时候可以这样设置GIT_TERMINAL_PROMPT=1 go get github.com/xxx/xxx这样可以确保私有仓库在拉取时,如果需要凭证,会在终端提示你输入。其中GIT_TERMINAL_PROMPT 表示允许 Git 在终端交互式地请求凭证
面试的时候有问到这个问题,最近也在琢磨这个问题。像之前经历公司里边,有5、6个项目后台,这些后台仅仅是实现单一的功能。所以在前后端不分离的情况下,很适合php开发。但是如果牵扯到高并发或者长链接这种场景。php 就有些捉襟见肘了。使用php 最灵活的就是array,这种的话,在php中基本上就是万能的。但是不止一家公司对接过程中。客户端吐槽,一会array,一会object。虽然可以依靠写代码人的
// 用两个channel来实现阻塞,需要注意的就是最后输出需要考虑其中一个channel已关闭,不能再次触发阻塞
a := []int{1, 2, 3, 4, 5}
b := []string{"a", "b", "c", "d", "e"}
var wg sync.WaitGrou