// Copyright (C) 2013-2018 by Maxim Bublis <b@codemonkey.ru>//// Permission is hereby granted, free of charge, to any person obtaining// a copy of this software and associated documentation files (the// "Software"), to deal in the Software without restriction, including// without limitation the rights to use, copy, modify, merge, publish,// distribute, sublicense, and/or sell copies of the Software, and to// permit persons to whom the Software is furnished to do so, subject to// the following conditions://// The above copyright notice and this permission notice shall be// included in all copies or substantial portions of the Software.//// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.package uuidimport ()// FromBytes returns a UUID generated from the raw byte slice input.// It will return an error if the slice isn't 16 bytes long.func ( []byte) (UUID, error) { := UUID{} := .UnmarshalBinary()return , }// FromBytesOrNil returns a UUID generated from the raw byte slice input.// Same behavior as FromBytes(), but returns uuid.Nil instead of an error.func ( []byte) UUID { , := FromBytes()if != nil {returnNil }return}var errInvalidFormat = errors.New("uuid: invalid UUID format")func fromHexChar( byte) byte {switch {case'0' <= && <= '9':return - '0'case'a' <= && <= 'f':return - 'a' + 10case'A' <= && <= 'F':return - 'A' + 10 }return255}// Parse parses the UUID stored in the string text. Parsing and supported// formats are the same as UnmarshalText.func ( *UUID) ( string) error {switchlen() {case32: // hashcase36: // canonicalcase34, 38:if [0] != '{' || [len()-1] != '}' {returnfmt.Errorf("uuid: incorrect UUID format in string %q", ) } = [1 : len()-1]case41, 45:if [:9] != "urn:uuid:" {returnfmt.Errorf("uuid: incorrect UUID format in string %q", [:9]) } = [9:]default:returnfmt.Errorf("uuid: incorrect UUID length %d in string %q", len(), ) }// canonicaliflen() == 36 {if [8] != '-' || [13] != '-' || [18] != '-' || [23] != '-' {returnfmt.Errorf("uuid: incorrect UUID format in string %q", ) }for , := range [16]byte{0, 2, 4, 6,9, 11,14, 16,19, 21,24, 26, 28, 30, 32, 34, } { := fromHexChar([]) := fromHexChar([+1])if | == 255 {returnerrInvalidFormat } [] = ( << 4) | }returnnil }// hash likefor := 0; < 32; += 2 { := fromHexChar([]) := fromHexChar([+1])if | == 255 {returnerrInvalidFormat } [/2] = ( << 4) | }returnnil}// FromString returns a UUID parsed from the input string.// Input is expected in a form accepted by UnmarshalText.func ( string) (UUID, error) {varUUID := .Parse()return , }// FromStringOrNil returns a UUID parsed from the input string.// Same behavior as FromString(), but returns uuid.Nil instead of an error.func ( string) UUID { , := FromString()if != nil {returnNil }return}// MarshalText implements the encoding.TextMarshaler interface.// The encoding is the same as returned by the String() method.func ( UUID) () ([]byte, error) {var [36]byteencodeCanonical([:], )return [:], nil}// UnmarshalText implements the encoding.TextUnmarshaler interface.// Following formats are supported://// "6ba7b810-9dad-11d1-80b4-00c04fd430c8",// "{6ba7b810-9dad-11d1-80b4-00c04fd430c8}",// "urn:uuid:6ba7b810-9dad-11d1-80b4-00c04fd430c8"// "6ba7b8109dad11d180b400c04fd430c8"// "{6ba7b8109dad11d180b400c04fd430c8}",// "urn:uuid:6ba7b8109dad11d180b400c04fd430c8"//// ABNF for supported UUID text representation follows://// URN := 'urn'// UUID-NID := 'uuid'//// hexdig := '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' |// 'a' | 'b' | 'c' | 'd' | 'e' | 'f' |// 'A' | 'B' | 'C' | 'D' | 'E' | 'F'//// hexoct := hexdig hexdig// 2hexoct := hexoct hexoct// 4hexoct := 2hexoct 2hexoct// 6hexoct := 4hexoct 2hexoct// 12hexoct := 6hexoct 6hexoct//// hashlike := 12hexoct// canonical := 4hexoct '-' 2hexoct '-' 2hexoct '-' 6hexoct//// plain := canonical | hashlike// uuid := canonical | hashlike | braced | urn//// braced := '{' plain '}' | '{' hashlike '}'// urn := URN ':' UUID-NID ':' plainfunc ( *UUID) ( []byte) error {switchlen() {case32: // hashcase36: // canonicalcase34, 38:if [0] != '{' || [len()-1] != '}' {returnfmt.Errorf("uuid: incorrect UUID format in string %q", ) } = [1 : len()-1]case41, 45:ifstring([:9]) != "urn:uuid:" {returnfmt.Errorf("uuid: incorrect UUID format in string %q", [:9]) } = [9:]default:returnfmt.Errorf("uuid: incorrect UUID length %d in string %q", len(), ) }iflen() == 36 {if [8] != '-' || [13] != '-' || [18] != '-' || [23] != '-' {returnfmt.Errorf("uuid: incorrect UUID format in string %q", ) }for , := range [16]byte{0, 2, 4, 6,9, 11,14, 16,19, 21,24, 26, 28, 30, 32, 34, } { := fromHexChar([]) := fromHexChar([+1])if | == 255 {returnerrInvalidFormat } [] = ( << 4) | }returnnil }for := 0; < 32; += 2 { := fromHexChar([]) := fromHexChar([+1])if | == 255 {returnerrInvalidFormat } [/2] = ( << 4) | }returnnil}// MarshalBinary implements the encoding.BinaryMarshaler interface.func ( UUID) () ([]byte, error) {return .Bytes(), nil}// UnmarshalBinary implements the encoding.BinaryUnmarshaler interface.// It will return an error if the slice isn't 16 bytes long.func ( *UUID) ( []byte) error {iflen() != Size {returnfmt.Errorf("uuid: UUID must be exactly 16 bytes long, got %d bytes", len()) }copy([:], )returnnil}
The pages are generated with Goldsv0.6.7. (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu.
PR and bug reports are welcome and can be submitted to the issue list.
Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds.