2015ǯ05��01��

Go �Ǥϥ��顼��ʸ������Ӥ��롩�Ȥ����äˤĤ���

¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÅÐÏ¿

Go �Ǵؿ�������ͤΥ��顼��Ƚ�̤���Ȥ��ˡ����顼��å�������ʸ���������å����륳���ɤ�¸�ߤ��ޤ��� (��)

����ϡ� Go �������߷פȤ��ƥ��顼�������ϼ���ä��ꡢɸ��饤�֥�꤬���顼������ڻ뤷�Ƥ��뤫��Ǥ��礦���� �����߷פ�ɸ��饤�֥���API���߷פ�ߤƹԤ��ޤ��礦��

TL;DR

  • �����߷פȤ��Ƥϡ�JavaŪ�㳰������Ʊ���ʾ�Ρ�ʸ������Ӥˤ��ʤ��˥��顼��������ǽ
  • ������ Go �Υ��顼�˴ؤ���ů�ؤˤ�ꡢ��������Ƥ��ʤ����顼��¿��
  • �ºݤ˥��顼��ʸ������Ӥ���Ƥ������ˤĤ��Ƥβ���

Go �Υ��顼������ˡ

Java ���㳰�����Ǥϡ��㳰�򥭥�å����뤿������Ѥι�ʸ���Ѱդ���Ƥ��ꡢ���ˤ��ޥå��󥰤��뤳�Ȥ��Ǥ��ޤ��� ����ϥ��饹�Υĥ꡼��¤�����Ѥ��ƥ��֥��饹��ޤȤ��ʬ�����뤳�Ȥ�Ǥ��ޤ��� �����ǡ�Ʊ�����饹�Ǥ��ͤˤ�ꥨ�顼�������ۤʤ���ˤϡ� try ��ͥ��Ȥ��ʤ��Ȥ����ʤ���������ͭ��ޤ���

���Ū����Ǥ������㳰�� Errno ���饹�ǡ��ʤ����Ĥ��� errno �� EINTR �ξ��ϥ�ȥ饤��������ʳ��Υ������ǤϽ�λ���륳���ɤϤ����ʤ�ޤ���

    try {
        while (true) {
            try {
                // ...
            } catch (Errno e) {
                if (e.getErrno() == Errno.EINTR) {
                    continue;
                }
                throw e;
            }
        }
    } catch (Exception e) {
        System.err.println(e.getMessage());
        System.exit(1);
    }

Go �ξ�硢����Ū�˥��顼�� error �Ȥ������󥿡��ե������ˤ�ä��֤���ޤ��� Go �ˤϥ��顼�������Ѥι�ʸ�Ϥ���ޤ��󤬡����󥿡��ե��������̤˻Ȥ��� conversion ��ʸ�� Java �� catch ��Ʊ���ʾ�ε�ǽ����äƤ���Τǡ�����ˤʤ�ޤ���conversion �ˤϼ���2����ν��������ꡢ���̤ˤ�äƻȤ�ʬ���ޤ���

    // ����ץ�� conversion.��� if ʸ���Ȥ߹�碌�ƻȤ������ʳ��ξ�P��if ʸ�˽񤱤롣
    if nerr, ok := err.(net.Error); ok && nerr.Temporary() {
        continue
    }

    // Type switch. ʣ���η��ο���ʬ���򸫤䤹���񤱤�
    switch e := err.(type) {
    case net.Error:
        if e.Temporary() {
            continue
        }
    // ...
    }

�ºݤˤ�ʣ���Υ��顼���򰷤��������Ϥ��ޤ�ʤ��Τȡ� io.EOF ���ͤ˷��ǤϤʤ��������Ӥ��륨�顼������Τǡ�����ץ�� conversion �� if ʸ���Ȥ߹�碌���褯�Ȥ��ޤ���

conversion �϶��η������Ǥʤ��̤� interface �ؤ��Ѵ����ǽ�ʤΤǡ� interface ����ݷ��Ȥ��ƻȤ����Ȥǡ� Java ���㳰���ؤ�Ʊ���褦��ʣ���η��Υ��顼��ޤȤ�ư������Ȥ��Ǥ��ޤ����㤨�С� syscall.Errno �� net.Error ���󥿡��ե�������������Ƥ���Τǡ���ۤɤΥ����ɤϼ��Τ褦�ˤ�����Ū�˽񤯤��Ȥ��Ǥ��ޤ���

    defer r.Close()
    for {
        data, err := r.Read()
        // �Ǹ�Υǡ������ɤ߹��ߤĤ�EOF���֤��������Τǡ����顼�����å����data�����å�����
        if len(data) > 0 {
            received <- data
        }
        if err == io.EOF {
            break
        }
        if err != nil {
            if nerr, ok := err.(net.Error); ok && nerr.Temporary() {
                continue
            }
            log.Error(err)
            break
        }
    }

Go �Υ��顼�˴ؤ���ů��

Go �κ�Ԥΰ�ͤǤ��� Dave Cheney ���Blog �ˡ�Go�Υ��顼���Ф�����פ�ů�ؤ��Ҳ𤵤�Ƥ��ޤ���

In the majority of cases, error values returned from functions should be opaque to the caller. That is to say, a test that error is nil indicates if the call succeeded or failed, and that��s all there is to it.

A small number of cases, generally revolving around interactions with the world outside your process, like network activity, require that the caller investigate the nature of the error to decide if it is reasonable to retry the operation.

��:

�ۤȤ�ɤΥ������ˤ����ơ��ؿ����֤��� error �ͤϸƤӽФ����ˤȤä���Ʃ���Ǥ���٤��Ǥ��� error �� nil ���ɤ��������å����뤳�ȤǸƤӽФ��������������ɤ������Τ뤳�Ȥ��Ǥ��������Ƥ���ʾ�Τ��ȤϤǤ��ޤ���

���ʤ��������ˤ����ơ���˥ͥåȥ���ʤɥץ��������������Ȥ��Ȥꤹ����ˡ��ƤӽФ�¦�����顼�μ��̤�Ĵ�٤ơ������ȥ饤����٤����ɤ��������ɬ�פ�����ޤ���

���� "error ... should be opaque to the caller" ����ʬ�ϡ���ǾҲ𤹤� issue �Ǥ� Go �� philosophy ���ȸ��ڤ���Ƥ��ޤ��� ���� Blog �����ϲ���������������Ȼפ��ޤ��������󤹤�ȼ��Τ褦�����ˤˤʤäƤ���褦�Ǥ���

  • ��ǽ�ʸ¤���̤ζ���Ū�ʥ��顼���䥨�顼����ϥѥå��������˸������ʤ�
  • ���顼������ɬ�פʾ��ϡ������ Timeout() bool �� Temporary() bool �Ȥ��ä���Ū�˱������᥽�åɤ��������

�����߷׻��ۤΤ���ˡ�����Υ��顼��Ƚ�̤��뤿��˥��顼��å�������ʸ����ޥå����뤷����ˡ���ʤ�������������ޤ���

Go ��ʸ����ǥ��顼��Ƚ�̤��Ƥ������

���֤褯ʸ������Ӥ���Ƥ��ޤäƤ��륨�顼�������֤� net.errClosing �Ǥ�������ϼ��Τ褦����������������Ƥ��륨�顼����Ǥ���

	errClosing                = errors.New("use of closed network connection")

���Υ��顼�ϡ� Close ���줿 Listener �� Conn �� Accept(), Read(), Write(), Close() �ʤɤΥ᥽�åɤ�ƤӽФ��������֤���ޤ���

���Υ��顼�� net �ѥå��������Ȥ�����ͤȤ����֤����ȥƥ�����Ǥ����Ȥ��Ƥ��餺�� if err == errClosing �Τ褦�ʻȤ����Ϥ���Ƥ��ޤ��� ���Υ��顼�������ä��ƤӽФ�¦�Ϥ��Ǥ������������̵���Τǡ� "should be opaque" �ʤΤ��Ȼפ��ޤ���

�����ǡ� Go �ϥͥåȥ���Υ֥��å���IO���󥿥���DZ��ä��ƥΥ�֥��å���IO��API���󶡤��Ƥ������ʤΤǡ� Listener.Accept() �� Conn.Read() �ϸƤӽФ�¦��֥��å����ޤ��������Υ᥽�åɤ����Ѥ���Ȥ�����Ω���� goroutine ��Ȥ��ޤ��������� Accept() �� Read() ���Ƥ��� goroutine ��ߤ����ʤϡ����� Listener �� Conn �� Close() ���뤳�ȤǤ�������Ū���߷פΥͥåȥ���ץ������ǡ�����ϤȤ��ơ� errClosing ���֤�ΤǤ���

errClosing �Τ褦�ʲ�����ǽ�ʥ��顼��ȯ��������������Ū�ʸ�����ϡ�Conn�Ǥ���Ф��Υ��å�����ΤƤ롢Listener �Ǥ���Хץ�����༫�Τ�ߤ�뤳�ȤǤ��������κݤ˥��顼������˽񤯤٤��Ǥ����������� errClosing �Τ褦������Ϥ�ȯ�����륨�顼�򥨥顼�����˽񤤤Ƥ����顢�����פʥ��顼����������Ƥ��ޤ��ޤ��� Close() �������Ȥ� Accept() �� Read() �Υ��顼��̵�뤹�뤳�Ȥ�Ǥ��ޤ����� Close() ����Τ��̤� goroutine �ʤΤ����ݤǤ����� errClosing �ʳ��Υ��顼�ޤ�̵�뤷�Ƥ��ޤ���ǽ�������뵤����������Ĥ�ޤ���

���� errClosing ��������Ƥۤ����Ȥ��� Issue golang/go#4373 �����ꡢ���顼�����˽񤭤����ʤ��Ȥ����桼������������Ƥ��줿��̡� Won't fix ��٥뤬�������ޤ������ޤ����������ȷ�ޤä��櫓�ǤϤ���ޤ��󤬡��߷׼Ԥ�����ʲ����Ǥ��ʤ����顼����̤˸�����ɬ�פ��ʤ��ˤȼºݤΥ桼���������ʤ��Υ��顼�ϥ����˽񤭤����ʤ��ˤΥߥ��ޥå��ΰ��֤�����Ȼפ��ޤ���

go#4373 �ȴ�Ϣ���� Issue �Ȥ��ơ�golang/go#9405 �⤢��ޤ��� ������ϡ� http ���饤����Ȥ򥿥��ॢ�����դ������Ѥ����ݤ� (Timeout() bool ��������Ƥ��ʤ�) errClosing �����Τޤ��֤���Ƥ��ޤ��Ȥ�������ǡ���ȯ��� Go 1.5 �ǤϽ����Ѥߤ�����ʤΤǤ��������ߥ�꡼������Ƥ��� Go 1.4 �ޤǤǤϥ����ॢ���Ȥ������ɤ�����Ƚ�ꤹ�뤿��� errClosing ��ʸ������Ӥ�ɬ�פˤʤäƤ��ޤäƤ��ޤ���

���Τ褦�ˡ��褷��¿����̵����ΤΡ��߷׼Ԥ����ꤷ�Ƥ��ʤ��桼����������Х��ˤ�ꥨ�顼��ʸ������Ӥ�Ƚ�ꤷ�Ƥ��륱��������ǰ�ʤ���¸�ߤ��ޤ��� �������������ޤǤ⤳�����㳰�Ǥ��äơ� Go �Υ��顼�������夤���饨�顼��ʸ������Ӥ��ʤ��Ȥ����ʤ��Ȥ��ä��褦�ʤ��ȤϤʤ��� Go ��ů�ؤϸ���Ū�ˤ��ޤ���ǽ���Ƥ���Ȼפ��ޤ���


@methane

songofacandy at 14:45��Comments(0)��TrackBack(0)��golang 

�ȥ�å��Хå�URL

���ε����˥����Ȥ���

̾��:
URL:
  ����òµ­²ï¿½: ɾ��: ��    ��
 
 
 
Blog�⸡��
�ǿ�����
Archives
���Υ֥����ˤĤ���
DSAS�Ȥϡ�KLab �����ۤ����Ѥ��Ƥ��륳��ƥ�ĥ����ӥ��Ѥ�Linux�١����Υ���ե�Ǥ�������5����Υǡ������󥿤ˤƹ��ۤ������Ѥ��Ƥ��ޤ������桹��DSAS����Ȥ��䤹�����������ˡ������Ƥ����ϤDZ��ѤǤ��뤳�Ȥ��ܻؤ��ơ��������ɤ˶Ф���Ǥ��ޤ���
���Υ֥����Ǥϡ������ DSAS �ǻȤäƤ��뵻�ѤξҲ�䡢�¸����Ƥߤ���̤���𡢥ȥ�֥�˴������ޤ줿���ηи��̤ʤɡ���������������������򿥤�ޤ��ƾҲ𤷤Ƥ��������Ȼפ��ޤ���
�ǿ�������
<%==comments[n].author%>
<% } %>